这两天在做一个网络程序时,遇到了通过进程pid获取进程路径的需求,之前是用CreateToolhelp32Snapshot获取指定pid的模块,然后通过Module32First获取到其中的路径信息。不过因为本身程序是32位的,在获取64位程序时,却返回了299错误。经过网上查询,找到了另外的方法:OpenProcess打开指定pid进程,获得其句柄,该进程要有PROCESS_QUERY_INFORMATION | PROCESS_VM_READ权限,再通过GetModuleFileNameEx获取该进程句柄的路径。
相关代码如下:
#include <Tlhelp32.h>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
char ProcessName[MAX_PATH] = { 0 };
int nPId;
GetDlgItemText(IDC_EDIT1, strText);
nPId= atoi(strText.GetBuffer(strText.GetLength()));
//根据pid获取路径的第一种方法:
MODULEENTRY32 me32 = { 0 };
me32.dwSize = sizeof(MODULEENTRY32);
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, nPId);
if (hModuleSnap == INVALID_HANDLE_VALUE)
{//如本身是32位程序,要去获取64位程序的模块,则会返回299错误
sprintf(ProcessName, "error=%d", GetLastError());
}
else
{
Module32First(hModuleSnap, &me32); // 获得全程路径.
strcpy(ProcessName, me32.szExePath);
}
AfxMessageBox(ProcessName);
//根据pid获取路径的第二种方法:
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, nPId);
if (hProcess)
{
if (GetModuleFileNameEx(hProcess, NULL, ProcessName, MAX_PATH) == 0)
{
sprintf(ProcessName, "error=%d", GetLastError());
}
}
CloseHandle(hProcess);
AfxMessageBox(ProcessName);