在C++中计算相同运行进程的总数

4
我正在寻找一种方法来检测具有相同进程名称的运行进程数量。例如,我运行了三次记事本,那么它将返回3。 我目前有这些代码来检测一个正在运行的进程,但不计算其运行进程数量。
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
bool IsProcessRunning(const char *ProcessName);
int main() { char *notepadRunning = (IsProcessRunning("notepad.exe")) ? "是" : "否"; std::cout << "记事本是否在运行? " << notepadRunning; return 0; }
bool IsProcessRunning(const char *ProcessName) { PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(Process32First(hSnapshot, &pe32)) { do { if(_tcsicmp(pe32.szExeFile, ProcessName) == 0) { CloseHandle(hSnapshot); return true; } } while(Process32Next(hSnapshot, &pe32)); }
CloseHandle(hSnapshot); return false; }
任何帮助都将不胜感激 :) 谢谢。
2个回答

5
你正在使用正确的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就可以了! - Yana D. Nugraha

0

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