gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:02:06 25 4
gpt4 key购买 nike

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

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

记事本.exe记事本记事本

所以它会返回 3。

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

#include <iostream>#include <windows.h>#include <tlhelp32.h>#include <tchar.h>bool IsProcessRunning(const char *ProcessName);int main(){  char *notepadRunning = (IsProcessRunning("notepad.exe")) ? "Yes" : "No";  std::cout << "Is Notepad running? " << 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;} 

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

谢谢。

最佳答案

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

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

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

要获取权限以便获得所有 session :

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()

关于c++ - 计算C++中相同运行进程的总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1218807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com