2011-10-31 21 views
22

Temel olarak, bir kereden fazla başlatılacak bir programım var. Yani, programın başlatıldığı iki veya daha fazla süreç olacak.Süreçler ada göre nasıl öldürülür? (Win32 API)

Win32 API'sini kullanmak ve belirli bir adla tüm işlemleri sonlandırmak/sonlandırmak istiyorum.

Bir işlemi öldürme örneklerini gördüm, ancak aynı ada sahip (ancak farklı parametrelerle) birden çok işlemi gerçekleştirmedim. kodunun altına

+1

Neden başarısız olana kadar tek bir işlemi tek bir işlemi öldürdüğün için yapmıyorsun? (daha fazla işlem yok) –

+0

Bir işlemi sonlandırmak tehlikeli bir işlemdir. Bu süreçleri neden öldürmeniz gerekiyor? Daha incelikli bir şekilde yapılabilir (örneğin, tüm pencereleri bir "WM_CLOSE" mesajını göndererek)? –

+0

Bir konsol uygulaması ... iyi bir python uygulaması py2exe ile bir .exe'e CONVERTED ve tek yolu zorla sonlandırmak gerektiğini düşünüyorum – dikidera

cevap

38

deneyin, killProcessByName() adıyla filename ile herhangi süreci öldürecek:

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

Not: Kod filename duyarlı olduğu, sen duyarsız durum için düzenleyebilirsiniz.

+0

Bu programın büyük/küçük harf duyarsız olmasını nasıl sağlayabilirim? – HereToLearn

+1

"strcmp" yerine başka bir karşılaştırma işlevi kullanabilirsiniz. [Bu] (http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c) – deepmax

+1

'if (hProcess! = NULL && pEntry.th32ProcessID! = GetCurrentProcessId())' önlemek için izleyin kendini öldürmek! ;-) – poukill

2

Benzer bir soruna rastladım. İşte ben neyim var ...

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);  
    } 
} 
İlgili konular