DruckenMister WongFacebook

Verwendung von CreateProcess

System Win9x, WinNT, Win2000, WinXP, Vista, Win7
Ab Delphi-Version Delphi 1
Letzte Änderung 07.02.2011

Um ein anderes Programm zu starten sollte man CreateProcess benutzen, da diese Funktion sehr viele Parameter kennt. Hier eine Funktion, die den Umgang damit erleichtert. In AFilename wird der Dateiname des Programms übergeben, in AParameter kann die Parameterzeile angegeben werden, in ACurrentDir übergibt man ein alternatives Startverzeichnis, bei einem leeren String wird das Verzeichnis der Exe benutzt. Setzt man ACurrentDir auf ein nicht vorhandenes Verzeichnis, startet die Anwendung nicht. Wenn AWait True ist, wartet das Programm darauf, dass das aufgerufene Programm beendet wird.Übergibt man den optionalen Parameter AOnWaitProc, so wird diese Funktion etwa alle 50 ms aufgerufen, bis das gestartete Programm wieder geschlossen wird.Über die Parameter, die AOnWaitProc übergeben werden, kann man auf den Prozess zugreifen und ihn ggf. beenden.

type
  TExecuteWaitEvent = procedure(const ProcessInfo: TProcessInformation;
                                    var ATerminate: Boolean) of object;

procedure ExecuteFile(const AFilename: String;
                 AParameter, ACurrentDir: String; AWait: Boolean;
                 AOnWaitProc: TExecuteWaitEvent=nil);
var
  si: TStartupInfo;
  pi: TProcessInformation;
  bTerminate: Boolean;
begin
  bTerminate := False;

  if Length(ACurrentDir) = 0 then
    ACurrentDir := ExtractFilePath(AFilename);

  if AnsiLastChar(ACurrentDir) = '\' then
    Delete(ACurrentDir, Length(ACurrentDir), 1);

  FillChar(si, SizeOf(si), 0);
  with si do begin
    cb := SizeOf(si);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := SW_NORMAL;
  end;

  FillChar(pi, SizeOf(pi), 0);
  AParameter := Format('"%s" %s', [AFilename, TrimRight(AParameter)]);

  if CreateProcess(Nil, PChar(AParameter), Nil, Nil, False,
                   CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
                   NORMAL_PRIORITY_CLASS, Nil, PChar(ACurrentDir), si, pi) then
  try
    if AWait then
      while WaitForSingleObject(pi.hProcess, 50) <> Wait_Object_0 do
      begin
        if Assigned(AOnWaitProc) then
        begin
          AOnWaitProc(pi, bTerminate);
          if bTerminate then
            TerminateProcess(pi.hProcess, Cardinal(-1));
        end;

        Application.ProcessMessages;
      end;
  finally
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  end;
end;

Beispielaufruf (kein Warten)


procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecuteFile('c:windows
otepad.exe', '', '', false);
end;

Beispielaufruf (mit Warten)Die Anwendung wird mit Button1 gestartet und kann mit Button2 beendet werden.


type
TForm1 = class(TForm)
  ...
private
  FTerminate: Boolean;
  procedure DoOnExecuteWait(const ProcessInfo: TProcessInformation;
                                   var ATerminate: Boolean);
end;


procedure TForm1.DoOnExecuteWait(const ProcessInfo: TProcessInformation;
                                   var ATerminate: Boolean);
begin
  ATerminate := FTerminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FTerminate := False;
  ExecuteFile('C:Windows
otepad.exe', '', '', True, DoOnExecuteWait);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FTerminate := True;
end;

Im Gegensatz zu Shellexecute können so wirklich nur ausführbare Programme gestartet werden.Nähere Informationen sind im PSDK unter dem Stichwort Process_Information zu finden.