从PID检索进程运行目录

时间:2018-07-21 06:43:08

标签: c++ windows

尝试使用PID检索进程的运行目录。我正在使用FindWindow()GetWindowThreadProcessId()获取PID,其结果与任务管理器中显示的进程ID相同,因此我认为它是正确的。

使用GetModuleFileNameEx()时,我得到的似乎是内存地址,而不是生成路径。

auto wnd = FindWindow(nullptr, L"prog");
while (wnd == nullptr)
{
    wnd = FindWindow(nullptr, L"prog");
}

TCHAR fBuf[MAX_PATH]; // buffer for path
DWORD procId; // process id
GetWindowThreadProcessId(wnd, &procId); // get process id
std::cout << procId << std::endl; // results in correct pid
auto procHdl = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, procId); // create handle for process
if (procHdl != NULL) {
    if (GetModuleFileNameEx(procHdl, 0, fBuf, MAX_PATH) == 0) {
        std::cerr << "Failed to get module filename." << std::endl;
    }
    else {
        std::cout << "Module filename is: " << fBuf << std::endl;
    }

    CloseHandle(procHdl);
}

示例输出为:

10488
Module filename is: 008CF93C

使用GetProcessImageFileNname()也有相同的结果。

1 个答案:

答案 0 :(得分:1)

要获取程序的目录,请首先使用GetModuleFileNameEx获取程序路径,然后您的目录将从第一个字符开始到找到的最后一个反斜杠。

示例:

程序为:“ C:\ Windows \ notepad.exe”;
目录是:“ C:\ Windows”;

在代码中:

DWORD pid = 104;
CHAR ProgramFile[MAX_PATH];
std::string DirectoryPath;
HANDLE hProcess = OpenProcess(PROCESS_VM_READ|PROCESS_QUERY_INFORMATION, FALSE, pid);
GetModuleFileNameExA(hProcess, NULL, ProgramFile, MAX_PATH);
DirectoryPath = ProgramFile;
DirectoryPath = DirectoryPath.substr(0, DirectoryPath.find_last_of('\\'));
std::cout << "ProgramFile: " << ProgramFile << endl;
std::cout << "Directory: " << DirectoryPath.c_str();
相关问题