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, &:stuck\_out\_tongue\_winking\_eye:Entry );
for( ; bOK; bOK=::stuck\_out\_tongue:rocess32Next( hSnapShot, &: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]