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
- 64位系统下C++获取当前所有进程的完整路径
- 获取当前所有进程的完整路径
- C#获取当前进程(程序)的完整路径备忘
- 获取系统当前所有进程
- C#获取当前程序运行路径的方法集合//获取当前进程的完整路径
- 获取本机所有进程的完整路径
- GetModuleFileName获取当前进程完整路径
- 用批处理获取当前目录下所有文件的路径
- 用批处理获取当前目录下所有文件的路径
- 用批处理获取当前目录下所有文件的路径
- java 获取当前路径下的所有xml文档
- 获取当前路径下的所有文件(子文件)
- 获取进程当前的路径
- 使用C Run-Time 获取当前进程的路径
- C/C++win32获取所有进程路径
- Linux C 获取当前进程可执行文件路径
- GetModuleFileName获取当前进程已加载模块的文件的完整路径
- C++ 获取当前进程加载模块的完整路径读取配置文件
- linux 同步时间
- c++ 求解数列最大的两个子段和
- leetcode Interleaving String
- STL 各种容器 比较函数重写
- ASP.NET 自定义分页按钮
- 64位系统下C++获取当前所有进程的完整路径
- Android: Type Method 'NewStringUTF' could not be resolved 的完美解决
- c# smtp client 的应用
- break、continue、return循环三剑客之异同
- 偏远地区解放军菜窖曝光 满满一屋腊味
- iOS IAP 一次支付,购买一种商品多次
- a9 mpcore processor其实就是多个a9 processor的集成
- java虚拟机内存大小调整:
- 模板题之广度搜索 HDU2717 Catch That Cow