2009-08-02 8 views
2

Ich bin auf der Suche nach einer Möglichkeit, die Anzahl der laufenden Prozesse zu erkennen, die den gleichen Prozessnamen hat.Zählen der gesamten gleichen laufenden Prozesse in C++

In meinem Beispiel habe ich den Editor dreimal ausgeführt.

notepad.exe notepad.exe notepad.exe

So wird es 3.

Im Moment habe ich diesen Code zurückgeben einen laufenden Prozess zu erkennen, aber nicht seine laufenden Prozess Menge zu zählen.

#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; 
}

Jede Art von Hilfe geschätzt :)

Danke.

Antwort

2

Sie verwenden die richtige API, nämlich CreateToolhelp32Snapshot, Process32First und Process32Next. Und währenddessen sollten Sie das Element szExeFile von der Struktur PROCESSENTRY32 verwenden.

Sie kehren von Ihrer Funktion zurück, wenn Sie jedoch eine Übereinstimmung finden. Stattdessen sollten Sie einen Zähler erhöhen und NICHT zurückgeben. Und geben Sie einen Int mit der Prozessanzahl anstelle eines Bool zurück. Stellen Sie sicher, dass Sie CloseHandle nicht ausführen (hSnapshot); bis zum Ende der Funktion, nachdem Sie die Zählung haben.

Achten Sie auch darauf, zuerst die Berechtigung SeDebugPrivilege vor dem Aufzählen zu erwerben, auf diese Weise erhalten Sie alle Prozesse über alle Sitzungen und Benutzer.

das Privileg, zu erwerben, so dass Sie alle Sitzungen erhalten:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege 

Wo acquirePrivilegeByName ist wie folgt definiert:

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

Dank! Es ist so einfach wie das Entfernen des CloseHandle! –

1

Möglicherweise haben Sie Probleme mit Zugriffsrechten. Insbesondere unter Vista glaube ich nicht, dass Sie alle Prozesse aufzählen können, wenn Sie nicht mit erhöhten Rechten arbeiten. Sie können auch versuchen, die API EnumProcesses zu verwenden. Es gibt eine complete example on how to enumerate all processes.

Verwandte Themen