簡體   English   中英

“const char *”類型的arg與“LPSTR”類型的參數不兼容c++

[英]arg of type “const char *” is incompatible with parameter of type “LPSTR” c++

嘿伙計們,我很抱歉問這個問題,但我還沒有在網上找到我的答案。 因此,在編譯我的項目之一時,我不斷收到錯誤“類型為“const char *”的參數與類型為“LPSTR”的參數不兼容。 當我將它發送給我的朋友相同的代碼時,他可以使用 Visual Studio 2017 在 Windows 10 上編譯它的所有內容。這是源代碼

    void RunProcess()
{
    runSetDebugPrivs();
    while (!FindProcessName("csgo.exe", &__gameProcess)) Sleep(12);
    while (!(getThreadByProcess(__gameProcess.th32ProcessID))) Sleep(12);
    __HandleProcess = OpenProcess(PROCESS_ALL_ACCESS, false, __gameProcess.th32ProcessID);
    while (__dwordClient == 0x0) __dwordClient = GetModuleNamePointer("client.dll", __gameProcess.th32ProcessID);
    while (__dwordEngine == 0x0) __dwordEngine = GetModuleNamePointer("engine.dll", __gameProcess.th32ProcessID);
    while (__dwordVGui == 0x0) __dwordVGui = GetModuleNamePointer("vguimatsurface.dll", __gameProcess.th32ProcessID);
    __HWNDCss = FindWindow(NULL, "Counter-Strike: Global Offensive");
}

};

我認為問題在於GetModuleNamePointer函數的第一個參數需要非常量char*字符串,但是在調用該函數時將const char*文字放在那里。 文字常量始終是const char* 造成這種情況的原因可能是其他風格的 C 語言在這種情況下無法區分這些。 一個可能的解決方法是更改​​該函數的聲明以在第一個參數中接受LPCSTR (又名const char* )而不是LPSTR (又名char* )。

你沒有顯示GetModuleNamePointer函數,所以我只能猜測。 如果這是我在 hack 論壇上找到的內容,則聲明如下:

DWORD GetModuleNamePointer(LPSTR LPSTRModuleName, DWORD __DwordProcessId);

但是它可以安全地與 const 一起使用,因此您可以簡單地將其更改為

DWORD GetModuleNamePointer(LPCSTR LPSTRModuleName, DWORD __DwordProcessId);

在聲明中進行此更改后,它將與您的編譯器兼容。

正如@StoryTeller 在評論中已經指出的那樣,您還可以禁用編譯器中的標准一致性。 以下是它的作用以及為什么對您有幫助的描述: https : //docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance

簡而言之:當您的 LPSTR 程序不起作用時,正確的行為可能會令人驚訝。 它適用於舊的編譯器,而新的編譯器更嚴格地遵循標准。 :-)

來自這個論壇條目的答案。 轉到項目“Properties -> C\\C++ -> Language”並確保“Conformance mode”設置為“NO”

暫無
暫無

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

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