#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 = OpenFileMapping(PAGE_READONLY, FALSE, MAP_OBJECT_NAME);
我对C++还比较陌生,我碰巧遇到了这个路障。当我试图将任何#define
放入像OpenFileMapping()
行这样的参数中时,我会得到一个错误:
类型的C++参数与类型的参数不兼容
我这个程序的最终目标是发送一条UDP消息,从共享内存中获取数据。
这是我使用void
而不是int
的结果吗?我不知道。
TCHAR
定义为wchar_t
或char
,具体取决于是否在项目设置中定义了UNICODE
。
OpenFileMapping()
是一个基于TCHAR
的预处理器宏。它被定义为在第三个参数中取一个指向以null结尾的字符串的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字符串(constwchar_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。在21世纪初微软推动迁移用户采用Unicode的过程中,它们旨在与传统的Win9x/ME代码向后兼容。您应该根据需要直接使用ANSI或Unicode函数。
在_T()
宏中换行。当在项目设置中选择Unicode WinAPI时,它将把LPCSTR字符串转换为LPCWSTR。
#define MAP_OBJECT_NAME _T("$pcars2$")
一个简单的解决方案是将OpenFileMapping
更改为OpenFileMappingA
。此版本采用您提供的窄字符串。