![](/img/trans.png)
[英]Error: argument of type char* is incompatible with parameter of type LPCWSTR
[英]LPCWSTR ERROR C++ argument of type is incompatible with parameter of type
#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 消息,該消息從共享的 memory 中獲取數據。
這是我使用void
而不是int
的結果嗎? 我不知道。
TCHAR
被定義為wchar_t
或char
,具體取決於UNICODE
是否已在您的項目設置中定義。
OpenFileMapping()
是一個基於TCHAR
的預處理器宏。 它被定義為在其第三個參數中采用指向空終止字符串的const TCHAR*
指針。
實際上, OpenFileMapping()
映射到OpenFileMappingA()
(ANSI) 或OpenFileMappingW()
(Unicode) function,具體取決於是否定義了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-only。
在您的情況下,定義了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。 在 2000 年代初微軟推動用戶遷移以采用 Unicode 期間,它們旨在向后兼容舊版 Win9x/ME 代碼。 您應該根據需要直接使用 ANSI 或 Unicode 函數。
將字符串包裝在_T()
宏中。 當在項目設置中選擇 Unicode WinAPI 時,它會將 LPCSTR 字符串轉換為 LPCWSTR。
#define MAP_OBJECT_NAME _T("$pcars2$")
一個簡單的解決方案是將OpenFileMapping
更改為OpenFileMappingA
。 此版本采用您提供的窄字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.