通過PID擷取進程路徑和進程名,使用了psapi.h類,擷取進程路徑,通過_splitpath()函數,擷取路徑中的檔案名稱。
_splitpath()使用方法:
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );
Return Value
None
Parameters
path
Full path
drive
Optional drive letter, followed by a colon (:)
dir
Optional directory path, including trailing slash. Forward slashes ( / ), backslashes ( \ ), or both may be used.
fname
Base filename (no extension)
ext
Optional filename extension, including leading period (.)
#include <iostream>#include <windows.h>#include "Psapi.h"#pragma comment (lib,"Psapi.lib")using namespace std;BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);void main(){charpath[_MAX_PATH+1]="";chardrive[_MAX_DRIVE];chardir[_MAX_DIR];charfname[_MAX_FNAME];charext[_MAX_EXT];DWORDProcessID;HANDLEhToken;//提升程式許可權OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);EnablePrivilege(hToken,SE_DEBUG_NAME);while(1){cin>>ProcessID;//處理系統函數if (ProcessID==4){cout<<"system"<<endl<<""<<endl;continue;}HANDLE h_Process=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,ProcessID);if (!h_Process){cout<<"error_process"<<endl;return;}GetModuleFileNameEx(h_Process,NULL,path,MAX_PATH+1);cout<<path<<endl;_splitpath(path, drive, dir, fname, ext );wsprintf(fname,"%s%s",fname,ext);cout<<fname<<endl;}}//提升許可權函數BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName){TOKEN_PRIVILEGES tkp;LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改進程許可權tkp.PrivilegeCount=1;tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系統修改進程許可權return( (GetLastError()==ERROR_SUCCESS) );}
另一種方法是通過tlhelper32.h來擷取系統所有進程的快照,從而擷取進程名及進程ID(沒找到如何通過這種方法擷取進程路徑)
註:此代碼轉自 王豔平:Windows程式設計(第二版)
#include "stdafx.h"#include <windows.h>#include <tlhelp32.h> // 聲明快照函數的標頭檔int main(int argc, char* argv[]){PROCESSENTRY32 pe32;// 在使用這個結構之前,先設定它的大小pe32.dwSize = sizeof(pe32); // 給系統內的所有進程拍一個快照HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap == INVALID_HANDLE_VALUE){printf(" CreateToolhelp32Snapshot調用失敗! \n");return -1;}// 遍曆進程快照,輪流顯示每個進程的資訊BOOL bMore = ::Process32First(hProcessSnap, &pe32);while(bMore){printf(" 進程名稱:%s \n", pe32.szExeFile);printf(" 進程ID號:%u \n\n", pe32.th32ProcessID);bMore = ::Process32Next(hProcessSnap, &pe32);}// 不要忘記清除掉snapshot對象::CloseHandle(hProcessSnap);return 0;}