无法将 char[9] 转换为 char*
Posted
技术标签:
【中文标题】无法将 char[9] 转换为 char*【英文标题】:Can't convert char[9] to char* 【发布时间】:2021-03-21 12:18:26 【问题描述】:我是游戏黑客的新手,我是从一个提供源代码的教程开始的。了解了它的作用后,我尝试编译,结果出现了 3 个相同的错误:
(错误 n.C2664)
错误与变量ProcessName
和ModuleName
有关。
即使我掌握了良好的 C++ 基础知识,我也总是在使用指针方面遇到困难。
对错误感兴趣的函数是这2个:
bool AttachProcess(char *ProcessName)
HANDLE hPID = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 procEntry;
procEntry.dwSize = sizeof(procEntry);
const WCHAR* procNameChar;
int nChars = MultiByteToWideChar(CP_ACP, 0, ProcessName, -1, NULL, 0);
procNameChar = new WCHAR[nChars];
MultiByteToWideChar(CP_ACP, 0, ProcessName, -1, (LPWSTR)procNameChar, nChars);
do
if (!wcscmp(procEntry.szExeFile, procNameChar))
this->dwPID = procEntry.th32ProcessID;
CloseHandle(hPID);
this->hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, this->dwPID);
return true;
while (Process32Next(hPID, &procEntry));
CloseHandle(hPID);
return false;
MODULEENTRY32 GetModule(char* ModuleName)
HANDLE hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
MODULEENTRY32 mEntry;
mEntry.dwSize = sizeof(mEntry);
const WCHAR* modNameChar;
int nChars = MultiByteToWideChar(CP_ACP, 0, ModuleName, -1, NULL, 0);
modNameChar = new WCHAR[nChars];
MultiByteToWideChar(CP_ACP, 0, ModuleName, -1, (LPWSTR)modNameChar, nChars);
do
if (!wcscmp(mEntry.szModule, modNameChar))
CloseHandle(hModule);
return mEntry;
while (Module32Next(hModule, &mEntry));
CloseHandle(hModule);
mEntry.modBaseAddr = 0x0;
return mEntry;
我在这里回忆起这些功能:
MemoryManager()
this->hProcess = NULL;
this->dwPID = NULL;
try
if (!AttachProcess("csgo.exe")) throw 1;
this->ClientDLL = GetModule("client.dll");
this->EngineDLL = GetModule("engine.dll");
//and so on
【问题讨论】:
const_cast<char*>("csgo.exe")
char[9]
很容易 衰减 到 char*
。 char const[9]
衰减为 char const*
。
既然函数以 ANSI 字符串作为输入,为什么要使用 Unicode API?您应该改用 ANSI API(Process32FirstA/Process32NextA
、Module32FirstA/Module32NextA
等)。无需使用MultiByteToWideChar()
,尤其是因为您正在泄漏new[]
'ed 内存。此外,在进入循环之前,您不会调用 Process32First()
或 Module32First()
。
【参考方案1】:
发生错误是因为您试图将字符串文字 (const char[]
) 传递给需要指向非 const char 数组 (char *
) 的指针的函数。
因为你从不修改ProcessName
的内容你应该改变
bool AttachProcess(char *ProcessName)
到
// VVVVV
bool AttachProcess(const char *ProcessName)
【讨论】:
【参考方案2】:我投射了“csgo.exe”、“engine.dll”和“client.dll”:
if (!AttachProcess(const_cast<char*>("csgo.exe"))) throw 1;
this->ClientDLL = GetModule(const_cast<char*>("client.dll"));
this->EngineDLL = GetModule(const_cast<char*>("engine.dll"));
【讨论】:
虽然这在这种特殊情况下会“起作用”,但通常不是最好的解决方案。 churill's answer 是更好的解决方案。以上是关于无法将 char[9] 转换为 char*的主要内容,如果未能解决你的问题,请参考以下文章
无法将 char (*)[1000] 转换为 char **
错误:无法将“char (*)[6]”转换为“char**”
JavaCPP 错误:无法将 `char*` 转换为 `Abc*` 以将参数 '1' 转换为 `void testMyObject(Abc*)`