Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wie kann ich eine fremde Exe beenden

  Alt 3. Aug 2007, 23:06
Die Lösung ist schlecht. Und zwar wegen dieser Zeile:
Result := TerminateProcess(OpenProcess(Process_Terminate, False, Prozess.th32ProcessID), 0); MSDN-Library durchsuchenTerminateProcess 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat