使用 GetModuleFileNameEx 分配缓冲区
Buffer Allocation With GetModuleFileNameEx
我目前正在尝试通过提供一个进程 ID 从我的可执行文件中获取完整的文件路径,这工作“很好”,因为它能够 return 一些需要的信息,但是对于一些它被破坏的原因,这可以在尝试 return 作为纯字符串时看到:C 如果你遍历每个字符并打印每个字母,你会变得更加混乱。尝试分配我的缓冲区时,我当前的编码在哪里出错?
std::string User::getFullPath() {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
char buffer[MAX_PATH];
if (hProcess != NULL)
{
GetModuleFileNameEx(hProcess, NULL, (LPWSTR)buffer, MAX_PATH);
CloseHandle(hProcess);
}
for (char i : buffer) {
std::cout << i<<std::endl;
}
return buffer;
}
在这种情况下如何正确分配内存以防止损坏
首先,如果 OpenProcess()
失败,数组的内容将不会被初始化。无需在调用进程 ID 上使用 OpenProcess()
。请改用 GetCurrentProcess()
,或直接使用 GetModuleFileName()
。
也就是说,真正的问题不在于内存分配,而是您错误地混合了 ANSI 和 Unicode。您正在将 char[]
缓冲区类型转换为 wchar_t*
,这是行不通的。
您需要:
- 改用
wchar_t[]
:
std::wstring User::getFullPath() {
wchar_t buffer[MAX_PATH] = {};
GetModuleFileNameW(NULL, buffer, MAX_PATH);
std::wcout << buffer << std::endl;
return buffer;
}
- 改用
GetModuleFileName(Ex)A()
:
std::string User::getFullPath() {
char buffer[MAX_PATH] = {};
GetModuleFileNameA(NULL, buffer, MAX_PATH);
std::cout << buffer << std::endl;
return buffer;
}
我目前正在尝试通过提供一个进程 ID 从我的可执行文件中获取完整的文件路径,这工作“很好”,因为它能够 return 一些需要的信息,但是对于一些它被破坏的原因,这可以在尝试 return 作为纯字符串时看到:C 如果你遍历每个字符并打印每个字母,你会变得更加混乱。尝试分配我的缓冲区时,我当前的编码在哪里出错?
std::string User::getFullPath() {
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
char buffer[MAX_PATH];
if (hProcess != NULL)
{
GetModuleFileNameEx(hProcess, NULL, (LPWSTR)buffer, MAX_PATH);
CloseHandle(hProcess);
}
for (char i : buffer) {
std::cout << i<<std::endl;
}
return buffer;
}
在这种情况下如何正确分配内存以防止损坏
首先,如果 OpenProcess()
失败,数组的内容将不会被初始化。无需在调用进程 ID 上使用 OpenProcess()
。请改用 GetCurrentProcess()
,或直接使用 GetModuleFileName()
。
也就是说,真正的问题不在于内存分配,而是您错误地混合了 ANSI 和 Unicode。您正在将 char[]
缓冲区类型转换为 wchar_t*
,这是行不通的。
您需要:
- 改用
wchar_t[]
:
std::wstring User::getFullPath() {
wchar_t buffer[MAX_PATH] = {};
GetModuleFileNameW(NULL, buffer, MAX_PATH);
std::wcout << buffer << std::endl;
return buffer;
}
- 改用
GetModuleFileName(Ex)A()
:
std::string User::getFullPath() {
char buffer[MAX_PATH] = {};
GetModuleFileNameA(NULL, buffer, MAX_PATH);
std::cout << buffer << std::endl;
return buffer;
}