簡體   English   中英

LPCWSTR ERROR C++ 參數類型與參數類型不兼容

[英]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_tchar ,具體取決於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 都像這樣分為AW版本。 近年來推出的較新的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM