如何通过进程名获取任何正在运行进程的句柄






3.57/5 (30投票s)
2002年8月6日
1分钟阅读

459409

8612
使用性能数据通过进程名获取任何正在运行进程的句柄。
引言
有几种方法可以获取任何正在运行的进程的进程ID(然后获取其句柄)。其中一种方法是使用在PSAPI.DLL中提供的函数,该DLL随Microsoft®平台软件开发工具包(SDK)一起分发。通常,可以通过性能数据获得相同的信息。
其中一个性能对象是“Process”,其索引为230。“Process”对象有几个计数器,其中一个是“ID Process”,其索引为784。一个名为GetProcessID
的函数遍历性能对象和计数器,并检索所需进程名称的进程ID。
以下示例演示了如何通过性能数据检索进程句柄。
示例
std::vector<DWORD> SetOfPID;
GetProcessID("Rundll32",SetOfPID);
// get all process id's of Rundll32
if (SetOfPID.empty()) // Process is not running
{
printf("Process is not running\n");
}
else // Process is running
{
for (int i=0;i < SetOfPID.size(); i++)
{
printf("Process ID is %d\n", SetOfPID[i]);
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS,FALSE,SetOfPID[i]);
// some code...
CloseHandle(hProcess);
}
}
更多使用性能计数器的文章
更新
我最初的版本仅返回第一个正在运行的实例。由于进程名称不是唯一的,我更改了我的代码,使其返回一组进程ID。
- 2013年1月13日 - 我在函数结束时释放了
PERF_DATA_BLOCK
的分配 - 2003年3月19日 - 我在函数结束时添加了对
RegCloseKey(HKEY_PERFORMANCE_DATA)
的调用 - 2003年6月15日 - 使用不区分大小写的比较来检查进程是否存在。
- 2004年5月24日 - 将
RegQueryValueEx
的第一个参数从“Global”(检索所有计数器)更改为指定特定进程对象和进程ID计数器的字符串。此更改可以实现快速查询。 - 2004年8月25日 - 源代码和演示已更新