Code erkläreung zu prozess / programm beenden
-
int main() { KillProcessByName("test.exe"); // Anstatt Icq.exe halt "Test.exe" eingeben! return 0; } int KillProcessByName(char *szProcessToKill) { HANDLE hProcessSnap; HANDLE hProcess; PROCESSENTRY32 pe32; DWORD dwPriorityClass; hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hProcessSnap == INVALID_HANDLE_VALUE ) { printError( "CreateToolhelp32Snapshot (of processes)" ); return( 0 ); } pe32.dwSize = sizeof( PROCESSENTRY32 ); if( !Process32First( hProcessSnap, &pe32 ) ) { printError( "Process32First" ); CloseHandle( hProcessSnap ); return( 0 ); } do{ if(!strcmp(pe32.szExeFile,szProcessToKill)) { printf("Prozess: %s \n",pe32.szExeFile); printf("PID: %d \n",pe32.th32ProcessID ); hProcess = OpenProcess(PROCESS_TERMINATE,0, pe32.th32ProcessID); TerminateProcess(hProcess,0); CloseHandle(hProcess); } } while( Process32Next(hProcessSnap,&pe32) ); CloseHandle( hProcessSnap ); return( 1 ); } void printError( TCHAR* msg ) { DWORD eNum; TCHAR sysMsg[256]; TCHAR* p; eNum = GetLastError( ); FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, eNum, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language sysMsg, 256, NULL ); // Trim the end of the line and terminate it with a null p = sysMsg; while( ( *p > 31 ) || ( *p == 9 ) ) ++p; do { *p-- = 0; } while( ( p >= sysMsg ) && ( ( *p == '.' ) || ( *p < 33 ) ) ); // Display the message printf( "\n WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg );Kann mir jemand diesen code genau erklären und wie das genau mit dem programm / prozess beenden funktioniert?
mfg
-
Schau' dir die Dokumentation der verwendeten APIs in der MSDN an und frag' nach, wenn dir etwas unklar ist.
greetz, Swordfish
BTW: Ab nach WinAPI.
-
Hm hab schon in der msdn nachgeschaut aber so 100% klar is mir noch nicht was hier genau gemacht wird und wieso.
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hProcessSnap == INVALID_HANDLE_VALUE ) { printError( "CreateToolhelp32Snapshot (of processes)" ); return( 0 ); } pe32.dwSize = sizeof( PROCESSENTRY32 ); if( !Process32First( hProcessSnap, &pe32 ) ) { printError( "Process32First" ); CloseHandle( hProcessSnap ); return( 0 ); } do{ if(!strcmp(pe32.szExeFile,szProcessToKill)) { printf("Prozess: %s \n",pe32.szExeFile); printf("PID: %d \n",pe32.th32ProcessID ); hProcess = OpenProcess(PROCESS_TERMINATE,0, pe32.th32ProcessID); TerminateProcess(hProcess,0); CloseHandle(hProcess); } } while( Process32Next(hProcessSnap,&pe32) ); CloseHandle( hProcessSnap ); return( 1 ); }
-
Stell bitte eine konkrete Frage.
-
Dieser Thread wurde von Moderator/in Shade Of Mine aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
wieso muss ich hier die größe des Prozesses erfragen?
pe32.dwSize = sizeof( PROCESSENTRY32 );
Für was benötigt man diese?
-
Hättest du in die MSDN geschaut dann hättest du diesen Satz gelesen

Remarks
The calling application must set the dwSize member of PROCESSENTRY32 to the size, in bytes, of the structure.
To retrieve information about other processes recorded in the same snapshot, use the Process32Next function.
schirrmie
-
simmero schrieb:
pe32.dwSize = sizeof( PROCESSENTRY32 );
Hast Du schon mal Gedanken darüber gemacht für was sizeof gut ist?
Und schau Dir die darauffolgende Zeile an. Des Rätsels Lösung ist die Funktion Process32First()!Tipp Nr.1: Drücke die Taste "F1" (oder nimm den Menüpunkt für die eingebaute Hilfe des Compilers bzw. der IDE)
Tipp Nr.2: Suche in der MSDN nach den Begriffen sizeof und Process32First
Tipp Nr.3: Suche mit Google o.ä. nach den Begriffen sizeof und Process32FirstUnd lese die Beschreibung von Process32First() genau durch (wichtiger Hinweis unter "Remark"
).
Wie Du siehst, Du kannst schon durch Eigeninitiative sehr viel erreichen...Martin
-
Das ist dafür da damit Process32First weiß mit welcher Version der Struktur sie zu tun hat. Damit hält sich Microsoft offen die Struktur noch zu erweitern.
-
Der Code beendet den Prozess, ist doch vollkommen klar. Oder hast du eine spezielle Frage?
-
Was da passiert ist mir auch klar aber ich wollte wissen was im background genau passiert.
mfg
-
Nur nochma zum Verständnis, hab ich das nun richtig verstanden mit:
hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
Erstelle ich mir eine Liste der aktuell laufenden Prozesse. Mit dieser Liste kann ich dann arbeiten.
-
Ja.
greetz, Swordfish
-
Ah ok danke. Noch eine Frage wann habe ich hier eine INVALID_HANDLE_VALUE? Das ist doch dann eine Falsche Adresse die ich da zurück bekomme oder?
pe32.dwSize = sizeof( PROCESSENTRY32 );
Die Größe benötige ich um zum nächsten Prozess in der Liste zu springen mit Process32Next(hProcessSnap,&pe32)?
-
INVALID_HANDLE_VALUEbekommst du, wenn beiCreateToolhelp32Snapshot( )etwas schief gegangen ist.Die Größe der Struktur brauchen
CreateToolhelp32Snapshot( )undProcess32Next( )weil es vonPROCESSENTRY32verschiedene Versionen in den unterschiedlichen Versionen von Windows gibt. Es sind über die Zeit immer wieder Attribute hinzugekommen und somit hat sich auch die Größe der Struktur verändert.greetz, Swordfish
-
danke für eure hilfe nun ist alles klar