Und genau das ist das Problem:
Ret := TerminateProcess(Ph, 0);
weswegen ich meinen Code vorziehen würde. TerminateProcess arbeitet asynchron:
Zitat von
PSDK:
TerminateProcess initiates termination and returns immediately.
Das heißt, es leitet den Prozess zum Beenden des Prozesses ein und kehrt sofort zurück. Der Rückgabewert signalisiert nur, ob TerminateProcess korrekt ausgeführt wurde, sprich, mit einem korrekten Prozesshandle. Der Rückgabewert sagt jedoch nichts darüber aus, ob der Prozess auch tatsächlich termniniert wurde. Deswegen sieht meine Routine so aus:
Delphi-Quellcode:
{...}
dw := Integer(TerminateProcess(hProcess, 1));
if dw <> 0 then
begin
// TerminateProcess returns immediately, so wie have to verify the result via
// WaitForSingleObject
dw := WaitForSingleObject(hProcess, Wait);
if dw = WAIT_FAILED then
dw := GetLastError;
end
{...}