如何解决LPCWSTR ERROR 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_t
或char
,具体取决于项目设置中是否已定义UNICODE
。
OpenFileMapping()
是基于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 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,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,MAP_OBJECT_NAME);
但是,现代编码实践完全不应该依赖TCHAR
API。它们的目的是在Microsoft于2000年代初推动用户迁移以采用Unicode的过程中与旧版Win9x / ME代码向后兼容。您应根据需要直接使用ANSI或Unicode函数。
将字符串包装在_T()
宏中。在项目设置中选择Unicode WinAPI时,它将LPCSTR字符串转换为LPCWSTR。
#define MAP_OBJECT_NAME _T("$pcars2$")
,
一个简单的解决方案是将OpenFileMappingA
更改为2d = [[1,2,3],[1,3,4]]
。此版本采用您提供的窄字符串。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。