Получить путь к процессу

Всем привет. У меня есть HANDLE процесса, и есть имя процесса, мне нужно получить путь к папке этого процесса. К примеру есть процесс "notepad.exe" мне нужно получить путь "C:\Windows\System32" Пишу на CodeBlocks с компилятором mingw32, прошу учесть, находил много ответов но ничего из них не работало.


Ответы (1 шт):

Автор решения: Georgy Firsov

Вот такой код работает. Я постарался подробно описать то, что происходит. Стоит отметить, что если GetModuleFileNameEx позвать из dll с хэндлом текущего процесса, то будет получен путь до исполняемого файла, а не до dll.

// Заголовки Windows
#include <Windows.h>
#include <psapi.h>

// Заголовки STL
#include <iostream>
#include <string>

int main()
{
    //
    // Получаем хэндл процесса.
    // Он обязан быть открытым с правами
    // PROCESS_QUERY_INFORMATION и PROCESS_VM_READ.
    // Я воспользуюсь просто текущим процессом.
    // 

    HANDLE hProcess = GetCurrentProcess();

    //
    // Буфером у меня будет строчка из STL,
    // в которой я выделю память под 260 символов.
    // 

    std::wstring sModulePath( MAX_PATH, L'\0' );

    //
    // Теперь вызовем GetModuleFileNameEx, передав
    // в неё наш хэндл, адрес первого символа
    // в буфере и его размер.
    // 

    DWORD dwWritten = GetModuleFileNameEx(
        hProcess,
        nullptr,
        &sModulePath[0], // Начиная с C++17, можно вот так: sModulePath.data()
        static_cast<DWORD>( sModulePath.size() )    
    );

    //
    // Функция вернёт количество записанных символов при успехе.
    // Или 0 в случае ошибки - проверим это.
    // 

    if (!dwWritten) 
    {
        //
        // Узнаем, что же пошло не так, и завершимся
        // 

        DWORD dwError = GetLastError();
        std::wcout << "Error code: " << dwError << std::endl;
        return dwError;
    }

    //
    // Если же всё прошло хорошо, то выведем путь до исполняемого файла
    // текущего процесса.
    // 

    std::wcout << "Module path: " << sModulePath << std::endl;

    return ERROR_SUCCESS;
}

Разобраться, как из пути к файлу получить директорию, думаю, труда не составит :) Например, есть PathRemoveFileSpec. А можно и просто обрезать строчку по последнему слешу.

→ Ссылка