64位系统下C++获取当前所有进程的完整路径
利用GetModuleFileName在32位机器上开发的程序,在64位机器上运行的时候,GetModuleFileName和GetModuleFileNameEX获取信息失败。解决64位机器获取失败的这个问题,有两个方法:
1.用64位机器开发64位的程序,用GetModuleFileNameEX方法。
2.用 QueryFullProcessImageName (Vista and up) or GetProcessImageFileName (XP and up)。
GetProcessImageFileName可以在xp和win7 32位和64位都能获取进程路径,GetModuleFileNameEx只能获取32位进程路径,但GetProcessImageFileName获取的路径都是包含设备名的路径,因此我们还要转换成一下,因此我们最终的GetProcessFullPath函数这样的。
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <tchar.h>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)
{
TCHAR szDriveStr[500];
TCHAR szDrive[3];
TCHAR szDevName[100];
INT cchDevName;
INT i;
//检查参数
if(!pszDosPath || !pszNtPath )
return FALSE;
//获取本地磁盘字符串
if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr))
{
for(i = 0; szDriveStr[i]; i += 4)
{
if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\")))
continue;
szDrive[0] = szDriveStr[i];
szDrive[1] = szDriveStr[i + 1];
szDrive[2] = '\0';
if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备名
return FALSE;
cchDevName = lstrlen(szDevName);
if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中
{
lstrcpy(pszNtPath, szDrive);//复制驱动器
lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径
return TRUE;
}
}
}
lstrcpy(pszNtPath, pszDosPath);
return FALSE;
}
//获取进程完整路径
BOOL GetProcessFullPath(DWORD dwPID)
{
TCHAR szImagePath[MAX_PATH];
TCHAR pszFullPath[MAX_PATH];
HANDLE hProcess;
if(!pszFullPath)
return FALSE;
pszFullPath[0] = '\0';
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID);
if(!hProcess)
return FALSE;
if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH))
{
CloseHandle(hProcess);
return FALSE;
}
if(!DosPathToNtPath(szImagePath, pszFullPath))
{
CloseHandle(hProcess);
return FALSE;
}
CloseHandle(hProcess);
_tprintf(_T("%d,%s \r\n"),dwPID,pszFullPath);
return TRUE;
}
int main(int argc, char* argv[])
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return NULL;
}
PROCESSENTRY32 pe ={0};
pe.dwSize = sizeof(PROCESSENTRY32);
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
GetProcessFullPath(pe.th32ProcessID);
//ShowModule(pe.th32ProcessID,pe.szExeFile); //仅32位
}
return 0;
}
仅在32位系统的也可以调用:
void ShowModule(DWORD PID,char *strExePath)
{
HANDLE hSnapShot;
BOOL fOk;
hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
MODULEENTRY32 me={sizeof(me)};
for(fOk=Module32First(hSnapShot,&me);fOk;fOk=Module32Next(hSnapShot,&me))
{
if (strstr(me.szExePath,strExePath) != NULL)
{
printf("%s \r\n",me.szExePath);
}
}
}
参考: http://blog.csdn.net/dongpanshan/article/details/18410203