Выделение буфера с помощью GetModuleFileNameEx - PullRequest
0 голосов
/ 17 июня 2020

В настоящее время я пытаюсь получить полный путь к файлу из моего исполняемого файла, указав идентификатор процесса, и это работает "нормально", поскольку он может возвращать некоторую необходимую информацию, однако по какой-то причине он становится поврежденным, и это можно увидеть, когда вы пытаетесь вернуть его как простую строку: 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;
}

введите описание изображения здесь

Как правильно выделить память в этом случае, чтобы предотвратить повреждение

1 Ответ

1 голос
/ 17 июня 2020

Прежде всего, содержимое вашего массива не инициализируется, если OpenProcess() не удается. Нет необходимости использовать 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;
}
...