TCHAR 定义为wchar_t 或char,具体取决于您的项目设置中是否分别定义了UNICODE。
OpenFileMapping() 是一个基于TCHAR 的预处理器宏。它被定义为在其第三个参数中将const TCHAR* 指针指向一个以空字符结尾的字符串。
实际上,OpenFileMapping() 会映射到 OpenFileMappingA() (ANSI) 或 OpenFileMappingW() (Unicode) 函数,具体取决于是否定义了 UNICODE:
// in winbase.h
WINBASEAPI
__out
HANDLE
WINAPI
OpenFileMappingA(
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in LPCSTR lpName
);
WINBASEAPI
__out
HANDLE
WINAPI
OpenFileMappingW(
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in LPCWSTR lpName
);
#ifdef UNICODE
#define OpenFileMapping OpenFileMappingW
#else
#define OpenFileMapping OpenFileMappingA
#endif // !UNICODE
大多数处理字符数据的旧版 Win32 API 被分成 A 和 W 这样的版本。近年来推出的新 API 往往仅支持 Unicode。
在您的情况下,UNICODE 已定义,因此您尝试传递一个窄字符串文字 (const char[]),其中需要一个 Unicode 字符串 (const wchar_t*)。这就是您收到类型不匹配错误的原因。
在基于TCHAR 的API 中使用字符/字符串文字时,请使用TEXT() 宏来确保文字使用TCHAR 实际映射到的正确字符类型,例如:
#include <iostream>
#include <WS2tcpip.h>
#include "sharedmemory.h"
#pragma comment (lib, "ws2_32.lib")
using namespace std;
#define MAP_OBJECT_NAME TEXT("$pcars2$") // <-- HERE
void main(int argc, char* argv[])
{
HANDLE fileHandle = OpenFileMapping(PAGE_READONLY, FALSE, MAP_OBJECT_NAME);
当UNICODE 被定义时,它有效地执行了以下操作:
#include <iostream>
#include <WS2tcpip.h>
#include "sharedmemory.h"
#pragma comment (lib, "ws2_32.lib")
using namespace std;
#define MAP_OBJECT_NAME L"$pcars2$"
void main(int argc, char* argv[])
{
HANDLE fileHandle = OpenFileMappingW(PAGE_READONLY, FALSE, MAP_OBJECT_NAME);
当UNICODE 未定义时这样做:
#include <iostream>
#include <WS2tcpip.h>
#include "sharedmemory.h"
#pragma comment (lib, "ws2_32.lib")
using namespace std;
#define MAP_OBJECT_NAME "$pcars2$"
void main(int argc, char* argv[])
{
HANDLE fileHandle = OpenFileMappingA(PAGE_READONLY, FALSE, MAP_OBJECT_NAME);
但是,现代编码实践根本不应该依赖TCHAR API。它们旨在向后兼容旧版 Win9x/ME 代码,因为微软在 2000 年代初期推动用户迁移以采用 Unicode。您应该根据需要直接使用 ANSI 或 Unicode 函数。