2011-02-03 6 views
0

午後、WINAPIプロセスハンドルをすべてのプロセスを経由することなく取得できますか? 私は、すべてのプロセスを反復することによって、その名前でプロセスハンドルをWINAPIする方法を知っている:すべてのプロセスを反復せずに、プロセス名でWINAPIプロセスハンドルを取得することは可能ですか?

 HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);  
    if (Process32First(snapshot, &entry) == TRUE){   
     while (Process32Next(snapshot, &entry) == TRUE)   
     {    
      if (stricmp(entry.szExeFile, ProcessName) == 0){     
       HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);     
       // measure process memory usage     
       CloseHandle(hProcess);    
      }   
     }  
     }  
     CloseHandle(snapshot); 

しかし、プロセスのスナップショットを反復処理するためにかなりの時間がかかるだろうように思えます。ありがとうございました。

+1

内部的にプロセスはリンクリストで管理されているため、最終的に誰かが繰り返し処理して名前を比較する必要があります。私は本当にあなたの心配が何であるかは分かりません。数百(最も極端な場合)の文字列の比較は、まったく時間がかかりません。 – Luke

+0

C#では、GetProcessesByNameを呼び出すことができますか?アンマネージドC++のようなものがありますか?ご協力ありがとうございました。 –

+0

いいえ、私の知る限りWin32 APIやフレームワーク(ATL/MFC/etc)に組み込まれているものはありません。自分で書く必要があります。あなたが与えたコード例で十分です。 GetProcessesByName()は、カバーの下にあるものと同様のものです。 – Luke

答えて

1

各プロセスには固有のIDがありますが、固有の名前はありません。同じ名前のプロセスが複数存在する可能性があります。だから、例えば、すべての値を繰り返すことなしで値によってstd::mapからエントリを取得することは不可能であるため、不可能です。しかし、あなたが行うことができるのは、名前のリストを提供する関数を書くことです。これは再利用可能ですが、それでも反復する必要があります。なぜここでパフォーマンスが心配ですか?私はそれがハンドルの開放とプロセスメモリ測定と比べて何もないと信じています。

関連する問題