2009-08-02 28 views
2

同じプロセス名を持つ実行中のプロセス数を検出する方法を探しています。C++で実行中のプロセスの合計を計算する

例では、メモ帳を3回実行しました。

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

正しいAPI、つまりCreateToolhelp32Snapshot,Process32FirstProcess32Nextを使用しています。そして、あなたがやっているときに、構造体PROCESSENTRY32からszExeFileメンバを使用する必要があります。

現在一致している場合は、関数から戻ります。代わりにカウンターをインクリメントして戻ってはいけません。そして、ブールの代わりにプロセスカウントでintを返します。また、CloseHandle(hSnapshot)を実行しないようにしてください。あなたがカウントをした後に関数の終わりまで。

はまた最初に、あなたはすべてのセッションとユーザー間のすべてのプロセスを取得するその方法を列挙する前に権限SeDebugPrivilegeを取得することを確認してください。

あなたはすべてのセッションを取得するように、権限を取得するには、次の

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

ありがとう:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege 

acquirePrivilegeByNameは以下のように定義されている場合! CloseHandleを削除するだけで簡単です! –

1

アクセス権に問題がある可能性があります。特にVistaでは、昇格した権限で実行しない限り、すべてのプロセスを列挙することはできません。

またEnumProcesses APIを使用することを試みることができます。 complete example on how to enumerate all processesがあります。

関連する問題