【问题标题】:Counting the total of same running processes in C++计算 C++ 中相同运行进程的总数
【发布时间】:2010-11-16 04:05:24
【问题描述】:

我正在寻找一种方法来检测具有相同进程名称的正在运行的进程数。

例如,我运行记事本 3 次。

记事本.exe 记事本.exe 记事本.exe

所以它会返回 3。

我目前有这些代码来检测一个正在运行的进程,但不计算它正在运行的进程数量。

#include 
#include 
#include 
#include 

bool IsProcessRunning(const char *ProcessName);

主函数()
{
  字符 *notepadRunning = (IsProcessRunning("notepad.exe")) ? “是”:“否”;
  std::cout 

任何形式的帮助将不胜感激:)

谢谢。

【问题讨论】:

    标签: c++ windows winapi process


    【解决方案1】:

    您使用的是正确的 API,即 CreateToolhelp32SnapshotProcess32FirstProcess32Next。正如您所做的那样,您应该使用结构 PROCESSENTRY32 中的 szExeFile 成员。

    当您当前找到匹配项时,您正在从您的函数返回。相反,您应该增加一个计数器而不是返回。并返回一个带有进程计数的 int 而不是 bool。也一定不要做 CloseHandle(hSnapshot);计数后直到函数结束。

    还要确保在枚举之前首先获得特权SeDebugPrivilege,这样您将获得所有会话和用户的所有进程。

    获取特权以便获得所有会话:

    acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
    

    acquirePrivilegeByName 定义为:

    BOOL acquirePrivilegeByName(
                                const TCHAR     *szPrivilegeName)
    {
        HANDLE          htoken;
        TOKEN_PRIVILEGES    tkp;
        DWORD           dwerr;
    
        //---------------- adjust process token privileges to grant privilege
        if (szPrivilegeName == NULL)
        {
            SetLastError(ERROR_INVALID_PARAMETER);
            return FALSE;
        }
    
        if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
            return FALSE;
    
        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
            return FALSE;
    
        if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
            GetLastError() != ERROR_SUCCESS)    // may equal ERROR_NOT_ALL_ASSIGNED
        {
            dwerr = GetLastError();
            CloseHandle(htoken);
            SetLastError(dwerr);
            return FALSE;
        }
    
        CloseHandle(htoken);
        SetLastError(ERROR_SUCCESS);
    
        return TRUE;
    } //acquirePrivilegeByName()
    

    【讨论】:

    • 谢谢!就像移除 CloseHandle 一样简单!
    【解决方案2】:

    您可能在访问权限方面遇到问题。特别是在 Vista 上,我认为您不能枚举所有进程,除非您以提升的权限运行。

    您也可以尝试使用EnumProcesses API。有一个complete example on how to enumerate all processes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多