[英]argument of type "WCHAR" is incompatible with parameter of type "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_t
或char
版本的結構和函數來解決; 例如,注釋中提到的GetModuleFileName
function 解析為GetModuleFileNameW
或GetModuleFileNameA
,具體取決於為構建選擇的字符集,並且這些調用中使用的結構具有明確定義的W
和A
版本。 因此,可以通過顯式使用這些函數和結構的A
或W
后綴版本來“覆蓋”項目設置的默認調用。
但是,不幸的是,在您的特定情況下, TlHelp32.h
header 文件(及其定義的函數)的定義不是很好:沒有明確A
后綴版本,因此您不能簡單地為MODULEENTRY32
和Module32First
引用添加后綴一個A
,就像一個人想要的那樣。 (對於 Unicode 構建,以W
為后綴的版本只會覆蓋“原始”function 和結構名稱,因此這些名稱隨后會丟失到您的代碼中。)
因此,無需更改代碼以始終使用TCHAR
類型( TCHAR
解析為char
或wchar_t
,具體取決於字符集選項),您唯一明智的選擇是上述快速修復:更改構建設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.