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

3
如果某个进程没有运行,我不应该显示某些上下文菜单选项。我正在使用进程名称来检查进程是否正在运行。
但问题在于,在不同的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
谢谢BobTFish,我下次会记住的。 - JChan
你尝试使用过 Module32First 吗?在这里可以看到 szExeFile 的描述:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx。 - hmjd
可能是重复的问题:如何在C++中查找.exe是否正在运行 - Mahmoud Al-Qudsi
全局的,还是仅在当前用户上下文中? - MSalters
3个回答

2

EnumProcesses 是列举活动进程的另一种方法。

不同之处在于,需要为 PIDs 分配空间,调用 EnumProcesses,使用 PROCESS_QUERY_INFORMATION 访问标志打开每个进程,然后在其句柄上调用 GetProcessImageFileName 进行比较。


一个很好的例子在这里:http://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx - lazy_banana

1

使用 WMI 来查询 Win32_Process 实例,可以检查运行进程的完整路径,以匹配您需要查看的进程。


0

您是所讨论的进程的作者吗?如果是,更健壮的设计是使用IPC直接查询该进程。这样,您不必一定进行轮询,并且不会出现令人烦恼的问题,例如如果检测到进程、创建上下文菜单,然后进程关闭会发生什么?


添加IPC很少能使进程更加健壮,除非付出大量的努力,尤其是如果唯一目的是实现操作系统已经允许的事情,比如进程监控。每个新的IPC通道都是一个潜在的安全漏洞。 - Steve Townsend

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接