64位系统下C++获取当前所有进程的完整路径

来源:互联网 发布:access数据库官方下载 编辑:程序博客网 时间:2024/06/16 20:21

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){TCHARszDriveStr[500];TCHARszDrive[3];TCHARszDevName[100];INTcchDevName;INTi;//检查参数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){TCHARszImagePath[MAX_PATH];TCHARpszFullPath[MAX_PATH];HANDLEhProcess;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



                                             
0 0
原创粉丝点击