【问题标题】:How to check if a process is running or not using C++如何使用 C++ 检查进程是否正在运行
【发布时间】:2012-05-17 14:49:47
【问题描述】:

如果一个进程没有运行,我不应该显示某些上下文菜单选项?。 我正在使用进程名称检查进程是否正在运行。

但问题是,进程名称在不同的 Windows 平台上显示方式不同。

即windows任务栏上的windows 64位进程名是“applicationname.exe

某些 windows xp 机器显示与“applica~2.exe”相同的进程名称

请告诉我检查进程是否正在运行的一致方法?

我的开发环境是 C++ 和 Visual Studio 2010

   DWORD getProcessID(const std::wstring& processName)
   {
       PROCESSENTRY32 info;
       info.dwSize = sizeof(info);

       HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
       if ( snapshot == INVALID_HANDLE_VALUE )
             return 0;

       Process32First(snapshot, &info);
       if ( !processName.compare(info.szExeFile) )
       {
             CloseHandle(snapshot);
             return info.th32ProcessID;
       }

       while ( Process32Next(snapshot, &info) )
       {
              if ( !processName.compare(info.szExeFile) )
               {
                    CloseHandle(snapshot);
                    return info.th32ProcessID;
               }
       }

      CloseHandle(snapshot);
     return 0;
   }

【问题讨论】:

  • 这是特定于 Windows 的,是吗?你应该添加一个标签。
  • 谢谢 BobTFish,下次我会记住的。
  • 您是否尝试过使用Module32First?请参阅szExeFilehere 下方的说明。
  • 全局,还是仅在当前用户上下文中?

标签: c++ winapi visual-c++


【解决方案1】:

EnumProcesses 是枚举活动进程的另一种方式。

不同的是你需要为PID分配空间,调用EnumProcesses,用PROCESS_QUERY_INFORMATION访问标志打开每个进程,然后在它的句柄上调用GetProcessImageFileName进行比较。

【讨论】:

【解决方案2】:

使用 WMI 询问 Win32_Process 的实例允许您检查正在运行的进程的完整路径,以查找您需要查看的匹配项。

【讨论】:

    【解决方案3】:

    您是相关流程的作者吗?如果是这样,更稳健的设计将是使用 IPC 直接询问过程。这样一来,您就不必进行轮询,也不会遇到烦人的问题,例如如果您检测到进程、创建上下文菜单然后进程停止会发生什么?

    【讨论】:

    • 添加 IPC 很少会在没有大量工作的情况下使流程更加健壮,尤其是。如果唯一的目的是实现操作系统已经允许的事情,比如进程监控。每个新的 IPC 通道都是等待发生的安全漏洞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多