HANDLE in HWND umwandeln ??
-
www.webfritzi.de.vu --> WinAPI-Ecke --> Units --> Unit "AppTerminating"
-
tsp schrieb:
so wie "Prozess beenden" im Task-Manager
Der Task-Manager kocht auch nur mit Wasser :
DWORD dwProcessID = 1234; HANDLE hProcess; hProcess = OpenProcess (PROCESS_TERMINATE,false,dwProcessID); TerminateProcess (hProcess,1);
tsp schrieb:
Es bleiben immer Programmreste übrig, die Prozesse sind nie richtig beendet.
Das musst Du genauer beschreiben. Konnte TerminateProcess () einen Prozess nicht beenden ?
-
merker schrieb:
tsp schrieb:
Es bleiben immer Programmreste übrig, die Prozesse sind nie richtig beendet.
Das musst Du genauer beschreiben. Konnte TerminateProcess () einen Prozess nicht beenden?
Die DLLs bleiben geladen. Zitat MSDN: "The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess."
-
Hallo merker,
merker schrieb:
Das musst Du genauer beschreiben. Konnte TerminateProcess () einen Prozess nicht beenden ?
also: Ich habe zu Testzwecken notepad.exe beendet. Danach war trotzdem noch notepad.exe im task-Manager zu sehen, aber das verrückte war: Ich konnte den (Rest-)Prozess mit dem Task-Manager nicht mehr beenden!!!
-
Bist du denn jetzt weitergekommen mit deinem Problem?
-
Ja WebFritzi,
deine Funktionen funktionieren einwandfrei
, aber ich hätte doch gern noch gewusst, wie ich das selber in meinen Code einbauen kann.
-
Schau in meinen Code rein. Viel ist es ja nicht.
-
tsp schrieb:
Ich habe zu Testzwecken notepad.exe beendet. Danach war trotzdem noch notepad.exe im task-Manager zu sehen, ...
Passiert das ständig, öfters oder ganz selten, bzw. nur bei notepad.exe oder auch bei anderen Prozessen ?
-
@tsp: Du hast meinen Post aber bemerkt oder *grinz* ?
-
@merker:
Es passiert ständig bei jedem Prozess!
-
tsp schrieb:
Es passiert ständig bei jedem Prozess!
Poste nochmal die Schleife in der Du TerminateProcess () aufrufst.
Im Augenblick sorgst Du für eine mittelschwere Sensation :
TerminateProcess () erzeugt "Zombies" ?!?//EDIT : Nachtrag hinzugefügt
-
Hier noch mal die Loop:
int isRun(string file) { HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof (processInfo); /*PROCESSENTRY32* processInfo = new PROCESSENTRY32; processInfo->dwSize = sizeof ( PROCESSENTRY32);*/ while ( Process32Next ( hSnapShot,&processInfo ) != FALSE) { if (strcmpi(processInfo.szExeFile,file.c_str())==0)return rocessInfo.th32ProcessID; }; CloseHandle ( hSnapShot); //delete processInfo; return 0; } void lock(string file) { while (true) { Sleep(5); int i=isRun(file); if (i!=0) { TerminateAppByWindowClosing(i, 0); //HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,FALSE,i); //TerminateProcess(h,12); //CloseHandle(h); } } } int main() { while (true) { Sleep(5); int i=isRun("notepad.exe"); if (i!=0) { HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,FALSE,i); TerminateProcess(h,12); CloseHandle(h); } } return 0; }
Bitteschön.
-
Die Loop ist ok.
Wie hoch ist die Aktualisierungsgeschwindigkeit vom Taskmanager ?
-
Keine Ahnung, ich schätze mal so 10-100 ms.
-
Wird langsam unheimlich die Sache. Funktioniert die "hardcoded" Variante von TerminateProcess () ohne Loop?
Falls nicht, was liefert GetLastError () zurück ?// notepad starten, pid dem taskmanager entnehmen und eintragen, kompilieren und starten DWORD pid = 1234; HANDLE h = OpenProcess (PROCESS_ALL_ACCESS,FALSE,pid); TerminateProcess (h,1); DWORD error = GetLastError (); CloseHandle (h);
-
Der Code funktioniert!!!!!
Mich laust der Affe.Ich versuch mal, den Unterschied zwischen deinem und meinem zu finden (
kann ja nich so schwer sein!?)
-
Hey, also ... ich weiß nich ... jetzt funktioniert meine loop, aber ich hab nix verändert!!
Danke für deine umfangreiche Hilfe merker!
PS: Wenn du noch was interessantes hast, dann post es .
-
tsp schrieb:
Wenn du noch was interessantes hast, dann post es.
Sobald Du "Prozessstrukturen", d.h. einen Parent- und seine Childprozesse beenden willst, wird es wieder interessant.
Aber das wäre ein neues Thema.