Funktion zum Prozess 'killen'

Hallo Leute !

Gibt es in der Win API eine Funktion, mit der ich einen laufenden Prozess sofort beenden kann, ohne lästige Fragen, ob ich mir denn auch sicher bin, usw.?
Also so etwas, wie bei Win 2000 im Taskmanager die Prozess beenden Funktion.

Vielen Dank schon mal
Maik

Hallo Maik!

TerminateProcess( HANDLE hProcess, UINT uExitCode );

sollte es tun, allerdings benötigtst Du dazu das Handle des zu „killenden“ Prozesses. Außerdem verursachst Du damit ein sog. „unkonditioniertes“ Prozessende mit allen zugehörigen Folgeerscheinungen (eventuelle globale DLL-Daten können komprimittiert werden [->Speicherlöcher], eventuelle zugehörige DLLs werden vom PRozess-Ende nicht informiert, eventuelle Kind-Prozesse können weiterlaufen, …).

Aber es funktioniert…

Grüße Safog

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Safog !

Gibt es auch die Möglichkeit den Namen des Prozesses anzugeben ?

Und wenn nicht, wie bekomme ich denn den Handle des gesuchten Prozesses heraus ?

Jetzt schon mal vielen Dank !

Maik

Hallo Maik!

Ich kann Dir eine meiner Funktionen zur Verfügung stellen:

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
 Bestimmt das zum übergebenen Prozess-Exectuable gehörende Prozess-Handle
 und gibt es zurück.
 Übergabe
 strProcessExe Prozess-Executable.
 dwDesiredAccess Benötigter Prozess-Zugriff.
 Rückgabe
 Zugehöriges Handle oder NULL im Fehlerfall.
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

HANDLE GetProcessHandle( CString strProcessExe, DWORD dwDesiredAccess )
{
 HANDLE hSnapShot; // System-Snap-Shot-Handle
 PROCESSENTRY32 PEntry; // Process-Enumerations-Struktur
 HANDLE hProcess; // Prozess-Handle
 CString strExeFile; // Hilfssstring
 BOOL bOK; // Abbruch-Flag

 // Liste aller im System laufenden Prozesse erstellen
 hSnapShot=::CreateToolhelp32Snapshot( TH32CS\_SNAPPROCESS, 0 );

 if( hSnapShot==INVALID\_HANDLE\_VALUE )
 // Fehler aufgetreten
 return NULL;

 // Prozess-Executable in Kleinbuchstaben wandeln
 strProcessExe.MakeLower( );


 // Prozess-Liste durchlaufen
 PEntry.dwSize=sizeof( PEntry );
 bOK=::stuck\_out\_tongue:rocess32First( hSnapShot, &amp:stuck\_out\_tongue\_winking\_eye:Entry );
 for( ; bOK; bOK=::stuck\_out\_tongue:rocess32Next( hSnapShot, &amp:stuck\_out\_tongue\_winking\_eye:Entry )){

 // Pozess-ID in Handle umwandeln
 hProcess=::open\_mouth:penProcess( dwDesiredAccess, FALSE, PEntry.th32ProcessID );
 if( hProcess==NULL )
 // Umwandlung misslungen
 continue;

 // Prozess-Executable in Kleinbuchstaben wandeln und prüfen
 strExeFile=PEntry.szExeFile;
 strExeFile.MakeLower( );
 if( strExeFile.Find( strProcessExe )!=-1 )
 // Passenden Prozess gefunden, Handle zurückgeben
 return hProcess;
 }

 // Nichts Passendes gefunden
 return NULL;
}

Damit kannst Du mit

TerminateProcess( GetProcessHandle( "test.exe", PROCESS\_TERMINATE ), 0 );

einen laufenden Prozess „test.exe“ beenden. Das gelingt aber nur, wenn der ausführende Benutzer auch die entsprechenden Rechte besitzt. GetProcessHandle( … ) kehrt bei fehlenden Rechten der einem anderen Fehler mit NULL zurück. Des Weiteren musst Du darauf achten, bei der Executable keinen Pfad anzugeben.

Grüße

Safog

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like