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.
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.
- Laufende Anwendung beenden
- Herausfinden, ob ein bestimmtes Programm gerade läuft
- Anwendung für eine bestimmte Zeit pausieren
- Mehrfachstart verhindern
- Programm vor dem Taskmanager verstecken
- Alle sichtbaren Fenster minimieren/wiederherstellen
- Ermitteln ob eine Exe-Datei läuft
- Auflisten aller Fenster
- Button klicken
- Beliebige Fenster minimieren, maximieren