LPCWSTR错误类型的C++参数与类型的参数不兼容


#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_tchar,具体取决于是否在项目设置中定义了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都分为AW两个版本,如下所示。近年来引入的较新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);

然而,现代编码实践根本不应该依赖于TCHARAPI。在21世纪初微软推动迁移用户采用Unicode的过程中,它们旨在与传统的Win9x/ME代码向后兼容。您应该根据需要直接使用ANSI或Unicode函数。

_T()宏中换行。当在项目设置中选择Unicode WinAPI时,它将把LPCSTR字符串转换为LPCWSTR。

#define MAP_OBJECT_NAME _T("$pcars2$")

一个简单的解决方案是将OpenFileMapping更改为OpenFileMappingA。此版本采用您提供的窄字符串。

相关内容

最新更新