【问题标题】:How to retrive process handle by using application name in c++?如何在 C++ 中使用应用程序名称检索进程句柄?
【发布时间】:2016-02-09 08:26:08
【问题描述】:

如何在c++中使用应用程序名获取进程句柄?

是否有任何 Windows API? 示例:Sample.exe

我必须得到这个 sample.exe 的句柄,并且我需要在那个句柄上调用 Terminate 进程。

任何人都为此提出了一个好的解决方案。

注意:它应该支持winxp和win8

提前致谢

【问题讨论】:

标签: c++ windows winapi win32-process


【解决方案1】:

您应该使用 toolhelp API:

HANDLE OpenProcessByName(LPCTSTR Name, DWORD dwAccess)
{
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe;
        ZeroMemory(&pe, sizeof(PROCESSENTRY32));
        pe.dwSize = sizeof(PROCESSENTRY32);
        Process32First(hSnap, &pe);
        do
        {
            if (!lstrcmpi(pe.szExeFile, Name))
            {
                return OpenProcess(dwAccess, 0, pe.th32ProcessID);
            }
        } while (Process32Next(hSnap, &pe));

    }
    return INVALID_HANDLE_VALUE;
}

例如:

#include <windows.h>
#include <tlhelp32.h>

//...

int main()
{

    HANDLE hFire = OpenProcessByName("firefox.exe", PROCESS_VM_READ);
    cout << "Handle: " << hFire << endl;
    CloseHandle(hFire);
    cin.get();
    return 0;
}

但你应该小心,因为如果有超过 1 个进程副本,你将获得第一个的句柄。要处理“返回 OpenProcess”中的所有进程,请调用 Handler(OpenProcess(dwAccess, 0, pe.th32ProcessID)) 等函数:

void Handler(HANDLE hndl)
{
  //... work with your Handle
  CloseHandle(hndl);
}
//...
if (!lstrcmpi(pe.szExeFile, Name))
{
    Handler(OpenProcess(dwAccess, 0, pe.th32ProcessID)):
}
//...

【讨论】:

  • 需要注意的是,这个版本返回的是找到的第一个匹配的句柄,而当前运行的文件可能有多个实例。
  • 我注意到了,看起来更好,引用:“但是你应该小心,因为如果有超过 1 个进程副本,你会得到第一个的句柄”。在我为每个进程发布代码之后
【解决方案2】:

要从进程 ID 中获取进程名称,请参阅问题:get process name from process id (win32)How to get the process name in C++

枚举流程文档https://msdn.microsoft.com/en-us/library/windows/desktop/ms682629%28v=vs.85%29.aspx 示例代码:https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682623%28v=vs.85%29.aspx

编辑:有一个没有问题的解决方案“返回找到的第一个匹配的句柄,而可能有多个实例”。此解决方案返回 ProcessId 和名称对的数组,您可以在简单循环中选择您需要的。

#include <windows.h>
#include <tlhelp32.h>

#include <iostream>
#include <utility>
#include <vector>
#include <string>
#include <map>

typedef std::pair<DWORD,std::string> ProcessVectorEntry;
typedef std::vector<ProcessVectorEntry> ProcessVector;

void getProcessInformation( ProcessVector& processVector ) {
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hSnapshot) {
        PROCESSENTRY32 pe32;
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if(Process32First(hSnapshot, &pe32)) {
            do {
               processVector.push_back( ProcessVectorEntry( pe32.th32ProcessID, pe32.szExeFile ) );
            } while(Process32Next(hSnapshot, &pe32));
         }
         CloseHandle(hSnapshot);
    }
}

在 main 中进行简单搜索

int main() {
  std::string search = "firefox.exe";

  ProcessVector processVector;
  getProcessInformation( processVector );

  std::cout << "Process IDs contains " << search << " in name:" << std::endl;

  for( int i=0; i<processVector.size(); ++i )
    if( processVector[i].second.find(search) != std::string::npos )
      std::cout << processVector[i].first << std::endl;

  return 0;
}

【讨论】:

  • 我知道你想先得到你的答案,但如果它只写了一半,充满了错别字,没有准确地命名 API 函数,那就不值得了。因此我投反对票。我建议您在按下发布您的答案按钮之前多花点时间完善答案。
  • 谢谢。我是新手,我不知道这是移动语气。我稍后会在稍后发布之前写更完整的答案。希望理解。
  • 问题是如何从可执行映像名称中获取进程句柄。尽管经过一些调整后,您的链接综合可能会导致这种情况,但您解释得不够清楚。
  • 解决任务就足够了。链接中有很多重复的任务解决方案和示例。
猜你喜欢
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
相关资源
最近更新 更多