类型 "const char *" 的参数与 "LPSTR" C++ 类型的参数不兼容

arg of type "const char *" is incompatible with parameter of type "LPSTR" c++

本文关键字:参数 类型 C++ 不兼容 LPSTR char const      更新时间:2023-10-16

嘿伙计们,我很抱歉问这个问题,但我还没有在网上找到答案。因此,在编译我的一个项目时,我不断收到错误"const char *"类型的参数与"LPSTR"类型的参数不兼容。当我将其发送给我的朋友时,相同的代码相同,他可以编译的所有内容都在使用 Visual Studio 10 的 Windows 2017 上。这是源代码

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功能,所以我只能猜测。如果这是我在黑客论坛上找到的,则声明如下:

DWORD GetModuleNamePointer(LPSTR LPSTRModuleName, DWORD __DwordProcessId);

但是它可以安全地与 const 一起工作,因此您可以简单地将其更改为

DWORD GetModuleNamePointer(LPCSTR LPSTRModuleName, DWORD __DwordProcessId);

在声明中更改此后,它将与您的编译器兼容。

正如@StoryTeller在注释中已经指出的那样,您还可以在编译器中禁用标准一致性。以下是它的作用以及为什么它可以帮助您的描述:https://learn.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance

简而言之:正确的行为是,也许令人惊讶的是,当你的LPSTR程序不起作用时。它适用于较旧的编译器,而新的编译器则更严格地遵循标准。:-)

答案取自此论坛条目。转到项目"属性 -> C\C++ -> 语言"并确保"一致性模式"设置为"否">