Prozess Killen



  • Hallo zusammen

    Ich möchte einen Prozess killen, ich habe allerdings keinen Handel.
    Ich habe legedlich den ProzessId und den Prozessname.
    Mit welcher WinAPI Funktion kann ich den Prozess killen?
    Gruss binggi



  • Hat sich erledig.
    Hier meine Lösung:

    BOOL bTerminateProcess(char *pcProcessName)
    {
      HANDLE hProcessSnap;
      HANDLE hProcess;
      PROCESSENTRY32 pe32;
      DWORD dwPriorityClass;
    
      // Take a snapshot of all processes in the system.
      hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      if(hProcessSnap == INVALID_HANDLE_VALUE)
      {
        printf("CreateToolhelp32Snapshot() Error: Invalid Handle Value\n");
        return(FALSE);
      }
      // Set the size of the structure before using it.
      pe32.dwSize = sizeof( PROCESSENTRY32 );
      // Retrieve information about the first process,
      // and exit if unsuccessful
      if(!Process32First(hProcessSnap, &pe32 ))
      {
        printf("Process32First(): Error");  // show cause of failure
        CloseHandle(hProcessSnap);        // clean the snapshot object
        return(FALSE);
      }
    
      //Alles Prozess durchsuchen
      do
      {
        //Process killen
        if(strcmp(pe32.szExeFile,pcProcessName)==0)
        {
          HANDLE   hProc ;
          DWORD   dwRet ;
    
          hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
          if(hProc == NULL)
            return (FALSE) ;
    
          // Wait on the handle. If it signals, great. If it times out,
          // then you kill it.
          if(WaitForSingleObject(hProc, 100)!=WAIT_OBJECT_0)
            dwRet=(TerminateProcess(hProc,0)?TRUE:FALSE);
          else
            dwRet = FALSE;
    
          CloseHandle(hProc);
    
          return (dwRet);
        }    
      } while(Process32Next( hProcessSnap, &pe32 ));
    
      CloseHandle(hProcessSnap);
    
      return(FALSE);
    }
    


  • Wenn du die PID (Process-Id) kennst, dann reicht eigentlich dieser Schnipsel aus deinem Code:

    hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, nPID); 
    if(hProc == NULL) 
      return (FALSE) ; 
    
    // Wait on the handle. If it signals, great. If it times out, 
    // then you kill it. 
    if(WaitForSingleObject(hProc, 100)!=WAIT_OBJECT_0) 
      dwRet=(TerminateProcess(hProc,0)?TRUE:FALSE); 
    else 
      dwRet = FALSE; 
    
    CloseHandle(hProc);
    


  • Das weiss ich, xD
    Nach diesem Teil habe ich auch gesucht, aber den Rest benötige ich zu überhaubt an die Id zu kommen.
    Oder geht das auch einfacher?
    Gruss Binggi



  • Versuche, ob du mit FindWindow() über den Titel ein Handle auf den gewünschten Prozess bekommst. Wenn ja, einfach WM_CLOSE senden.



  • Mit FindWindow bekommt mein kein handle auf den Prozess, sondern auf ein Fenster. Und WM_CLOSE beendet keinen Prozess, sondern schließt nur das Fenster. Und wenn es nicht das Hauptfenster der Anwendung ist, hast du Pech gehabt und der Prozess besteht noch. Und noch mehr Pech hast du, wenn die Anwendung nachfragt, ob wirklich das Programm beendet werden soll.



  • Meine Lösung funktioniert wunderbar.
    Aber Danke für die Vorschlag.


  • Mod

    Bei der Verwendung von TerminateProcess ist es genauso wie die Endlagerung Radioaktives Abfalls in der Schachtanlage Asse.

    Klar kann man es machen... ob es gut ist steht wo ganz anders geschrieben... 🤡

    Insofern ist der Einwurf mit WM_CLOSE korrekt und für viele Bereiche ein gangbarer Weg.

    BTW: Man kann auch ein Programm bauen, dass ein Programm schließt obwohl es reagiert.
    1. Top-Level Fensterhandle des Prozesses ermitteln.
    2. Das Fenster analysieren. Ist es ein Dialog, kontrolliere ob es evtl. als MsgBox erkannt werden kann.
    Wenn ja: Buttons ermitteln... nach Gusto, Verfügbarkeit und Funktionsweise die man beabsichtigt, IDYES, IDNO, IDCANCEL als WM_COMMAND posten.
    Wenn nein: WM_CLOSE senden.
    3. Noch ein Fenster da? Prozess fertig? Wenn nein weiter bei 1.
    Das ganze höchstens 4 mal Versuchen...

    Dieses Vorgehen eignet sich speziell, wenn man eigentlich genau weiß welche Art von Programm man hier terminieren will... und man kommt zu 100% ohne TerminateProcess aus.



  • Bei der Verwendung von TerminateProcess ist es genauso wie die Endlagerung Radioaktives Abfalls in der Schachtanlage Asse.

    Wenn das so ist, dann lass ich es... wohne in der Schweiz, genügen Abstand. 😃
    Diese Funktion sollte nur bei einem Fehler ausgeführt werden, und der dürfte nicht viel vorkommen. Und solange die Hardware keinen Schaden von TerminateProcess davon trägt, lass ich es und bete.



  • Binggi,

    lasse dich als Schweizer nicht gleich entmutigen. Martins Vergleich mit Asse war wohl eher scherzhaft gemeint. Da kann an deiner Hardware nichts kaputt gehen. Beim nächsten Systemstart ist alles neu und wenn du deinen Computer fachgerecht entsorgst passiert auch nichts. Das Matterhorn bleibt unbeschädigt! :p



  • Mit Unicode und der _TCHAR-Zuordnung wchar_t gibt es mit Binggis Code einen Fehler:
    E2034 Konvertierung von 'wchar_t *' nach 'const char *' nicht möglich

    und zudem sollte man doch _tcscpy anstatt strcpy nutzen, oder?

    Wie müsste dann der geänderte Binggi-Code aussehen?



  • williman schrieb:

    Wie müsste dann der geänderte Binggi-Code aussehen?

    //BOOL bTerminateProcess(char *pcProcessName)
    BOOL bTerminateProcess(wchar_t *pcProcessName)
    
    //if(strcmp(pe32.szExeFile,pcProcessName)==0)
    if(wcscmp(pe32.szExeFile,pcProcessName)==0)
    

    Mal davon abgesehen dass ich den Code nicht schön finde sollte es damit gehen. 😉



  • @Martin Richter

    Martin Richter schrieb:

    Bei der Verwendung von TerminateProcess ist es genauso wie die Endlagerung Radioaktives Abfalls in der Schachtanlage Asse.

    Klar kann man es machen... ob es gut ist steht wo ganz anders geschrieben... 🤡

    Also dass es Probleme mit Programmen geben kann, die nicht "crash safe" programmiert sind, ist mir klar. Also so Sachen wie zerschossene Settings-Files bzw. allgemein zerschossene Datenfiles und ähnliches.

    Aber gibt es davon abgesehen noch ein bekanntes Problem?

    Der Kernel sollte ja, sowie ein Thread z.B. im Kernel nen systemweiten Lock nimmt, dafür sorgen dass der Thread bzw. der ganze Prozess nicht abgeschossen werden kann bis der Lock wieder freigegeben wurde.

    Bleiben noch diverse Usermode-Teile die z.B. über Shared-Memory kommunizieren. Gibt es da welche wo bekannt ist dass "im falschen Moment" abgeschossene Prozesse zu einem Problem führen können?

    Mir sind nämlich keine Teile des OS bekannt die dabei ein Problem hätten.
    Weswegen ich TerminateProcess auch als "nicht wirklich schlimm" einstufe. Falls das nicht stimmen sollte, wäre es natürlich gut zu erfahren dass es nicht stimmt. Wäre also cool wenn du dazu kurz was schreiben könntest!


  • Mod

    @alle: Achtung! Threadnekromantie! Auch wenn das Ausgraben des Threads in diesem Fall gerechtfertigt ist, solltet ihr doch auf das Datum der Beiträge achten, auf die ihr in diesem Thread antwortet.



  • Ach ich wünsche mir schon lange Titel bzw. Achievements für User.
    Dann könnte man im Falle des Falles, also wenn jmd. das wiederholt macht, dem User einfach den Titel bzw. das Achievement "Nekromant" verleihen 🙂


  • Mod

    hustbaer schrieb:

    Ach ich wünsche mir schon lange Titel bzw. Achievements für User.
    Dann könnte man im Falle des Falles, also wenn jmd. das wiederholt macht, dem User einfach den Titel bzw. das Achievement "Nekromant" verleihen 🙂

    Den Titel für verdiente Dauernekromanten gibt es bereits. Der nennt sich "gesperrt" 😉



  • Aber es gäbe noch so viele andere coole Achievements!

    Und man könnte damit coole Insiderwitze machen.
    z.B. ein "unscharf" Achievement für Leute die die ganze Zeit dumme Fragen stellen, in Anlehnung an den Namen eines berühmt-berüchtigten Users hier.


  • Mod

    hustbaer schrieb:

    z.B. ein "unscharf" Achievement für Leute die die ganze Zeit dumme Fragen stellen, in Anlehnung an den Namen eines berühmt-berüchtigten Users hier.

    LOL! 😃

    Prinzipiell müsste so etwas möglich sein. Die Forenadministration kann prinzipiell jedem Nutzer einen eigenen Titel geben.






Anmelden zum Antworten