输出特定进程所在位置的完整路径,并输出路径。
方法1 定位某个进程(比如 QQMusic.exe)所在的全路径,下面是代码:
string GetProcessInfo(HANDLE hProcess,char* processName) { PROCESSENTRY32* pinfo = new PROCESSENTRY32; MODULEENTRY32* minfo = new MODULEENTRY32; char shortpath[MAX_PATH];
int flag = Process32First(hProcess,pinfo); while(flag){
if(strcmp(pinfo->szExeFile, processName) == 0){
HANDLE hModule = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pinfo->th32ProcessID );
Module32First( hModule, minfo );
GetShortPathName( minfo->szExePath, shortpath, 256 );
return shortpath; } flag = Process32Next(hProcess, pinfo); }
return NULL; }
int main() { HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)}; while (Process32Next(hProcessSnap,&process)){ string processName = process.szExeFile; if(processName == "QQMusic.exe"){ string s_exePath = GetProcessInfo(hProcessSnap,"QQMusic.exe"); cout << s_exePath << endl; break; } } return 0; }
|

方法2 第一种方法有些 bug,下面说下另一种方法
另一种方法:
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 process = {sizeof(PROCESSENTRY32)};
while (Process32Next(hProcessSnap,&process)){ string processName = process.szExeFile; cout << processName << endl; char chpath[MAX_PATH]; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID); GetModuleFileNameEx(hProcess,NULL,chpath,sizeof(chpath)); cout << chpath << endl; cout << "-------------------" << endl; }
|
但是注意,这种方法不能获取路径在 system32 的进程路径,其余正常:

方法3(推荐) 目前没有发现 Bug,无法读取应用程序拒绝访问的进程路径,其他没有问题。
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)){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,string &fullPath){ 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); fullPath = pszFullPath;
return TRUE; }
|
调用例子:
tring str_filePath; GetProcessFullPath(进程ID,str_filePath);
|