簡體   English   中英

參數類型 (WCHAR*) 與“const char*”類型的參數不兼容

[英]Argument Type (WCHAR*) is incompatible with parameter of type "const char*)

這是一些 CSGO 代碼的一部分,我不知道如何解決這個問題; 它位於如下所示代碼段的第 8 行:

在此處輸入圖像描述

uintptr_t GetModuleBaseAddress(const char* modName) {
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE) {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry)) {
            do {
                if (!strcmp(modEntry.szModule, modName)) {
                    CloseHandle(hSnap);
                    return (uintptr_t)modEntry.modBaseAddr;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
}

錯誤信息:

Argument Type (WCHAR*) is incompatible with parameter of type "const char*)

如評論中所述,您的問題在於您的(新)項目具有“使用 Unicode 字符集”選項集,但(舊)代碼庫預計將使用“使用多字節字符集”構建“ 選項。 (前者對 Windows API 調用和結構中的字符串使用wchar_t*類型,而后者使用char*類型;這些是不兼容的指針。)

因此,“快速修復”是將項目的構建選項設置為使用“多字節”字符集。 在 Visual Studio 2019 中,當您在解決方案資源管理器中右鍵單擊項目時,此選項是項目的屬性 -> 高級 -> 字符集 早期版本的 Visual Studio 在常規屬性選項卡 IIRC 中有選項。

如果您正在使用其他一些 IDE,那么您需要“手動”取消定義UNICODE宏(向編譯器發出“Unicode 字符集”正在使用的信號); #undef UNICODE之前的任何#include <...>系統標頭行將起作用。

對於大部分(大多數)Windows API,這個問題也可以通過使用顯式wchar_tchar版本的結構和函數來解決; 例如,注釋中提到的GetModuleFileName function 解析為GetModuleFileNameWGetModuleFileNameA ,具體取決於為構建選擇的字符集,並且這些調用中使用的結構具有明確定義的WA版本。 因此,可以通過顯式使用這些函數和結構的AW后綴版本來“覆蓋”項目設置的默認調用。

但是,不幸的是,在您的特定情況下, TlHelp32.h header 文件(及其定義的函數)的定義不是很好:沒有明確A后綴版本,因此您不能簡單地為MODULEENTRY32Module32First引用添加后綴一個A ,就像一個人想要的那樣。 (對於 Unicode 構建,以W為后綴的版本只會覆蓋“原始”function 和結構名稱,因此這些名稱隨后會丟失到您的代碼中。)

因此,無需更改代碼以始終使用TCHAR類型( TCHAR解析為charwchar_t ,具體取決於字符集選項),您唯一明智的選擇是上述快速修復:更改構建設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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