Подсчет общего количества одинаковых запущенных процессов в C ++ - PullRequest
2 голосов
/ 02 августа 2009

Я ищу способ обнаружить # запущенных процессов с одинаковым именем процесса.

Например, я трижды запускал блокнот.

notepad.exe notepad.exe notepad.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;
} 

Буду признателен за любую помощь:)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 августа 2009

Вы используете правильный API, а именно CreateToolhelp32Snapshot , Process32First и Process32Next . И, как вы делаете, вы должны использовать член szExeFile из структуры PROCESSENTRY32 .

Вы возвращаетесь из своей функции, когда вы находите совпадение в настоящее время. Вместо этого вы должны увеличивать счетчик и НЕ возвращаться. И вернуть int с числом процессов вместо bool. Также не делайте CloseHandle (hSnapshot); до конца функции после того, как у вас есть счет.

Также убедитесь, что сначала получили привилегию SeDebugPrivilege перед перечислением, таким образом вы получите все процессы для всех сеансов и пользователей.

Чтобы получить привилегию, чтобы получить все сеансы:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege

Где acquPrivilegeByName определяется как:

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()
1 голос
/ 02 августа 2009

У вас могут быть проблемы с правами доступа. В частности, в Vista я не думаю, что вы можете перечислить все процессы, если вы не запускаете с повышенными привилегиями.

Вы также можете попробовать использовать EnumProcesses API. Существует полный пример того, как перечислить все процессы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...