Win-Prozess (Programm) beenden
-
Hi zusammen,
ahbe mit einn kleines Script geschrieben, welches die aktiven Prozesse von Windows in eine Listbox schreibt!
DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; cProcesses = cbNeeded / sizeof(DWORD); for ( i = 0; i < cProcesses; i++ ) if( aProcesses[i] != 0 ) ListBoxProzesse->Items->Add(kl_prozesse->holeProzesse(aProcesses[i])); ... AnsiString KL_Prozesse::holeProzesse(DWORD ID) { char szProcessName[MAX_PATH] = "unknown"; HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ID); if(hProcess) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) ) GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) ); } CloseHandle(hProcess); return String(szProcessName); } ...Jetzt würde ich gerne den aus der Listbox susgewählten Prozess beenden!
Wie mach ich das?Danke Bench
-
TerminateProcess(hProcess)
-
Hi,
erstmal danke!
Aber es geht noch nicht!
Habe es so probiert:int ID = ListBoxProzesse->ItemIndex; HANDLE hProcess; if(hProcess) TerminateProcess(hProcess,ID); CloseHandle(hProcess);Dann kommt eine Exception!
An was leigt das?Danke bench
-
Hallo
- Das HANDLE ist uninitialisiert
- TerminateProcess kann nichts mit dem Index aus deiner Listbox anfangen.Überleg dir mal was die Sache mit dem HANDLE bedeutet.
bis bald
akari
-
Hi,
ok!
Das "int" ist Quatsch!Brauch ja ein DWORD dafür!
Aber wie kann ich dann den ausgweählten Prozess aus der Listboy beenden?Danke Bench
-
Hallo
Indem du den HANDLE, den du beim Auslesen der Prozeße ja schon hast, mit in die Listbox speicherst. Das geht zum Beispiel so
DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; cProcesses = cbNeeded / sizeof(DWORD); for ( i = 0; i < cProcesses; i++ ) if( aProcesses[i] != 0 ) kl_prozesse->addProzess(aProcesses[i], ListBoxProzesse->Items); ... void KL_Prozesse::addProzess(DWORD ID, TStrings* items) { char szProcessName[MAX_PATH] = "unknown"; HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ID); if(hProcess) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) ) GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) ); items->AddObject(String(szProcessName), reinterpret_cast<TObject*>(hProcess)); } } ...Nun kannst du aus der Listbox das HANDLE wieder auslesen :
int ID = ListBoxProzesse->ItemIndex; if (ID >= 0) { HANDLE hProcess = reinterpret_cast<HANDLE>(ListBoxProzesse->Items->Objects[ID]); }bis bald
akari
-
Hi,
erstmal vielen Dank!!!
Hab jetzt nur noch eine Frage!!!Button "Prozess beenden":
.. int ID = ListBoxProzesse->ItemIndex; if (ID >= 0) { HANDLE hProcess = reinterpret_cast<HANDLE>(ListBoxProzesse->Items->Objects[ID]); TerminateProcess(hProcess);//Fehler, da Übergabeparameter fehlt (unsigned int) } ..Da fehlt noch ein Übergabeparameter!Aber welcher?
Sorry!!
Aber nochmals vielen Dank!!Bench
-
Hallo
Wenn du mal die Forums-Suchfunktion benutzt hättest, hättest du zum Beispiel diesen Thread gefunden.
bis bald
akari
-
Hi,
ok sorry!
Habe es jetzt so:int ID = ListBoxProzesse->ItemIndex; if (ID >= 0) { HANDLE hProcess = reinterpret_cast<HANDLE>(ListBoxProzesse->Items->Objects[ID]); TerminateProcess(hProcess,0xffffffff); }Aber es tut sich nichts!Der prozess wird nicht beendent!!!???
An was liegt das!es kommt kein Compilerfehler, aber der Prozess läuft trotzdem normal weiter?Danke Bench
-
Hallo
Syntaktisch ist der Codeausschnitt jedenfalls korrekt.
Überprüf doch mal den Rückgabewert von TerminateProcess, wie in der MSDN angegeben.bis bald
akari
-
Hi,
erstmal danke!
Also wird in der Regel so angegeben:
TerminateProcess(hProcess,0);Muss ich den Prozess vieleicht erst mal nochmals öffen?
Danke
-
Hallo
Du darfst das HANDLE beim Eintragen in die Listbox gar nicht erst schließen. Schau in meinen bearbeiteten Code, ich habe das CloseHandle rausgenommen.
Geschlossen werden dürfen alle Handles erst wenn die Listbox selber verschwindet/neu gefüllt wird.bis bald
akari
-
Hi,
habe das HANDLE nicht geschlossen!
Hier nochmal mein COde:... DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return; cProcesses = cbNeeded / sizeof(DWORD); for ( i = 0; i < cProcesses; i++ ) if( aProcesses[i] != 0 ) kl_prozesse->addProzess(aProcesses[i], ListBoxProzesse->Items); ... void KL_Prozesse::addProzess(DWORD ID, TStrings* items) { char szProcessName[MAX_PATH] = "unknown"; HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ID); if(hProcess) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) ) GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) ); items->AddObject(String(szProcessName), reinterpret_cast<TObject*>(hProcess)); } } ... int ID = ListBoxProzesse->ItemIndex; if (ID >= 0) { HANDLE hProcess = reinterpret_cast<HANDLE>(ListBoxProzesse->Items->Objects[ID]); TerminateProcess(hProcess,0); }Woran kann es noch liegen?
-
Hallo
Wir haben keine Lust zu raten. Ich verweise noch mal auf den Rückgabewert von TerminateProcess, nachzulesen in der MSDN.
bis bald
akari
-
hi,
is schon klar!Habe es so gemacht:
if(TerminateProcess == 0)ShowMessage("nicht erfolgreich"); else {int a = (int)TerminateProcess; AnsiString b = a; ShowMessage("ergolgreich:"+b);}Jetzt kommt "erfolgreich:4296484"!
Folglich müsste es doch erfolgreich sein, oder?
Kannst du damit was anfangen?Danke Bench
-
Bench_XProjects schrieb:
Aber es tut sich nichts! Der prozess wird nicht beendent!!!???
Da fehlt noch ein Flag :
// HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,ID); HANDLE hProcess = OpenProcess( PROCESS_TERMINATE | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,ID);
-
Hallo
Bench_XProjects schrieb:
if(TerminateProcess == 0)ShowMessage("nicht erfolgreich"); else {int a = (int)TerminateProcess; AnsiString b = a; ShowMessage("ergolgreich:"+b);}Du hast den MSDN-Artikel nicht sehr gründlich gelesen, sonst wüßtest du das die Rückgabe 0 bedeutet das der Aufruf erfolgreich war und alles außer 0 ein Fehlercode ist, den du mittels FormatMessage auch in Klartext übersetzen lassen kannst.
Der Hinweis von merker ist aber schon mal interessant.
bis bald
akari
-
Bench_XProjects schrieb:
Jetzt kommt "erfolgreich:4296484"! Folglich müsste es doch erfolgreich sein, oder?
Mit "int a = (int)TerminateProcess;" läßt Du Dir die Adresse einer Adresse anzeigen. Die wird vermutlich immer ungleich 0 sein.
Besser so hier :
if ( TerminateProcess (hProcess,0) == 0 ) { // Aufruf von TerminateProcess schlug fehl DWORD err = GetLastError (); // err kann man sich via FormatMessage anzeigen lassen } else { // Aufruf von TerminateProcess erfolgreich }
-
Hi zusammen,
vielen Dank!
Aber checks einfach it!?
wieso bracuh ich da denn wieder ein neues Handle?
Prinzipiell ist der Process doch noch offen?sorry Jungs, aber bin bezüglich der Winapi noch eine absolute Niete...!!!
Trotzdem schon mal danke
Bench
-
Mit OpenProcess holst du dir den Handle auf einen laufenden Prozess. Wenn er noch nicht da ist, wird die Funktion einen Fehler zurückliefern.
Um einen Prozess zu starten, mußt du CreateProcess benutzen, das mal so am Rande.
Das Handle speicherst du m.E. auch falsch in der Listbox ab, es sollte zu den Index des Prozessnamen gehören.
Bsp (aus der Luft gegriffen):
ListBox->Items->Add("Ein Prozess"); ListBox->Items->Objects[ListBox->Items->Count-1] = (TObject*)HProcessHandle;