使用 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;
}