微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

LPCWSTR ERROR C类型的参数与类型

如何解决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_tchar,具体取决于项目设置中是否已定义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都被分成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,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 举报,一经查实,本站将立刻删除。