如何使用 C++ 检查进程是不是正在运行

Posted

技术标签:

【中文标题】如何使用 C++ 检查进程是不是正在运行【英文标题】: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 下方的说明。 how to find if a .exe is running in c++的可能重复 全局,还是仅在当前用户上下文中? 【参考方案1】:

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

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

【讨论】:

一个很好的例子在这里:msdn.microsoft.com/en-us/library/windows/desktop/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

添加 IPC 很少会在没有大量工作的情况下使流程更加健壮,尤其是。如果唯一的目的是实现操作系统已经允许的事情,比如进程监控。每个新的 IPC 通道都是等待发生的安全漏洞。

以上是关于如何使用 C++ 检查进程是不是正在运行的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用 C、C++ 在 Linux 上指定其名称以编程方式检查特定守护程序是不是正在运行?

如何检查 impala 守护进程实例和状态存储守护进程实例是不是正在运行?

如何使用 Qt (C++) 检查程序是不是按其名称运行

如何检查正在运行的进程是不是是后台进程? [关闭]

如何在启动 C++ 应用程序时检查 mongodb 是不是正在运行

如何使用 C++ 以编程方式杀死进程?