gpt4 book ai didi

c++ - LPCWSTR ERROR C++类型的参数与类型的参数不兼容

转载 作者:行者123 更新时间:2023-12-02 09:47:52 25 4
gpt4 key购买 nike

#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++ argument of type is incompatible with parameter of type


我对该程序的最终目标是发送一条UDP消息,该消息从共享内存中获取数据。
这是我使用 void而不是 int的结果吗?我不知道。

最佳答案

TCHAR定义为wchar_tchar,分别取决于在项目设置中是否已定义UNICODEOpenFileMapping()是基于TCHAR的预处理器宏。它的定义是在第3个参数中使用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字符串(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。它们的目的是在Microsoft于2000年代初 push 用户迁移以采用Unicode的过程中与旧版Win9x / ME代码向后兼容。您应根据需要直接使用ANSI或Unicode函数。

关于c++ - LPCWSTR ERROR C++类型的参数与类型的参数不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63695080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com