通过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() { char path[_MAX_PATH+1]=""; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; DWORD ProcessID; HANDLE hToken; //提升程序权限 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; }