65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (30投票s)

2002年8月6日

1分钟阅读

viewsIcon

459409

downloadIcon

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日 - 源代码和演示已更新
© . All rights reserved.