通过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;
- }