Die Lösung ist schlecht. Und zwar wegen dieser Zeile:
Result := TerminateProcess(OpenProcess(Process_Terminate, False, Prozess.th32ProcessID), 0);
TerminateProcess kehrt nämlich sofort zurück und der Rückgabewert signalisiert nur, ob die Funktion korrekt ausgeführt wurde oder nicht. Aber nicht, ob der Prozess auch wirklich terminiert wurde. Eine saubere Lösung könnte so aussehen:
Delphi-Quellcode:
{*
* Procedure : KillProcess
* Author : Michael Puff
* Date : 2006-09-15
* Terminates a process identified by its PID
*}
function KillProcess(dwProcID, Wait: DWORD): Integer;
var
hProcess : Cardinal;
dw : DWORD;
begin
// open the process and store the process-handle
hProcess := OpenProcess(SYNCHRONIZE
or PROCESS_TERMINATE, False, dwProcID);
// kill it
if hProcess <> 0
then
begin
dw := Integer(TerminateProcess(hProcess, 1));
if dw <> 0
then
begin
// TerminateProcess returns immediately, so we have to verify the result via
// WaitForSingleObject
dw := WaitForSingleObject(hProcess, Wait);
if dw = WAIT_FAILED
then
dw := GetLastError;
end
else // TerminateProcess = 0
dw := GetLastError;
CloseHandle(hProcess);
end
else // hProcess = INVALID_HANDLE_VALUE
dw := GetLastError;
result := dw;
end;
Allerdinsg sollte man es möglichst vermeiden eonen Prozess so zu beenden. Dnn geöffnete DLLs, werden so nicht entladen bzw. deren Referenzzähler wird nicht dekrementiert. Besser ist es an das Hauptfenster eine WM_CLOSE Nachricht zu schicken.
Edit: Mein 23.000stes Posting.