2011-10-31 35 views
22

基本的に、私は複数回起動されるプログラムを持っています。したがって、プログラムは2つ以上のプロセスで起動されます。名前でプロセスを強制終了するには? (Win32 API)

私はWin32 APIを使用し、特定の名前を持つすべてのプロセスを強制終了する必要があります。

私はプロセスを殺す例を見たことがありますが、全く同じ名前(しかし異なるパラメータ)のプロセスはありません。コードの下

+1

失敗するまで、繰り返し1つのプロセスを強制終了するとどうなりますか? (killするプロセスがなくなる) –

+0

プロセスを終了するのは危険な操作です。なぜあなたはこれらのプロセスを殺す必要がありますか?より優雅に(WM_CLOSEメッセージをすべてのウィンドウに送るなどして)行うことはできますか? –

+0

これはコンソールアプリケーションです... pythonアプリケーションをpy2exeで.exeに変換し、唯一の方法は強制的に終了することです – dikidera

答えて

38

てみてください、killProcessByName()は名前filenameで任意のプロセスを強制終了します:

#include <windows.h> 
#include <process.h> 
#include <Tlhelp32.h> 
#include <winbase.h> 
#include <string.h> 
void killProcessByName(const char *filename) 
{ 
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); 
    PROCESSENTRY32 pEntry; 
    pEntry.dwSize = sizeof (pEntry); 
    BOOL hRes = Process32First(hSnapShot, &pEntry); 
    while (hRes) 
    { 
     if (strcmp(pEntry.szExeFile, filename) == 0) 
     { 
      HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, 
              (DWORD) pEntry.th32ProcessID); 
      if (hProcess != NULL) 
      { 
       TerminateProcess(hProcess, 9); 
       CloseHandle(hProcess); 
      } 
     } 
     hRes = Process32Next(hSnapShot, &pEntry); 
    } 
    CloseHandle(hSnapShot); 
} 
int main() 
{ 
    killProcessByName("notepad++.exe"); 
    return 0; 
} 

注:コードはfilenameに大文字と小文字が区別され、あなたは大文字と小文字を区別のためにそれを編集することができます。

+0

このプログラムの大文字小文字を区別しないようにするにはどうすればよいですか? – HereToLearn

+1

'strcmp'の代わりに別の比較関数を使うことができます。 [回避するにはif(hProcess!= NULL && pEntry.th32ProcessID!= GetCurrentProcessId()) 'を実行する[this](http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c) – deepmax

+1

あなた自身を殺す! ;-) – poukill

2

私はちょうど同様の問題に遭遇しました。ここに私が思いついたことがあります...

void myClass::killProcess() 
{ 
    const int maxProcIds = 1024; 
    DWORD procList[maxProcIds]; 
    DWORD procCount; 
    char* exeName = "ExeName.exe"; 
    char processName[MAX_PATH]; 

    // get the process by name 
    if (!EnumProcesses(procList, sizeof(procList), &procCount)) 
     return; 

    // convert from bytes to processes 
    procCount = procCount/sizeof(DWORD); 

    // loop through all processes 
    for (DWORD procIdx=0; procIdx<procCount; procIdx++) 
    { 
     // get a handle to the process 
     HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procList[procIdx]); 
     // get the process name 
     GetProcessImageFileName(procHandle, processName, sizeof(processName)); 
     // terminate all pocesses that contain the name 
     if (strstr(processName, exeName)) 
     TerminateProcess(procHandle, 0); 
     CloseHandle(procHandle);  
    } 
} 
関連する問題