如何使用 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
?请参阅szExeFile
here 下方的说明。
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 守护进程实例和状态存储守护进程实例是不是正在运行?