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 函数。