Hallo zusammen, hatte mir mal Gedanken um das starten einer Datei mit Rückgabe des Handles aufs ausführende Programm gemacht.
Mit CreateProcess ist dies ja nicht möglich, aber nach durchstöbern der Win-API bin ich auf ShellExecuteEx gestoßen. Ich zumindest hatte diese EX Version von ShellExecute nie beachtet. Was ein Fehler war!
Anbei ein kleines Beispiel in Delphi, es ist nur wichtig das in fMask das Flag „SEE_MASK_NOCLOSEPROCESS” gesetzt wird.
Für weitere Optionen bitte die API – Hilfe hierzu lesen, so kann z.B über "hInstApp"
eine genauere Error Analyse erfolgen.
Die Abbruch Variable ist Optional und wurde zum testen mit einem Extra Button gesetzt.
Ist mir schon bewusst dass dies kein Delphi Forum hier ist, aber ich
denke doch, dass dies für den einen oder anderen hier mal hilfreich sein könnte.
// Beispiel function ist ohne extra Thread nur für Testzwecke.
Var
Abbruch: Boolean;
function ExecuteAndWait(const Command: String): Integer;
var w: Integer;
ExecuteInfo: TSHELLEXECUTEINFO;
begin
Result:= -1;
FillChar(ExecuteInfo, SizeOf(TSHELLEXECUTEINFO), 0);
With ExecuteInfo do
begin
cbSize:= SizeOf(TSHELLEXECUTEINFO);
lpVerb:= 'open';
lpFile:= PChar(Command);
fMask:= SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI;
Wnd:= Application.Handle;
end;
If ShellExecuteEx(@ExecuteInfo) and (ExecuteInfo.hInstApp> 32) then
begin
w:= -1;
If ExecuteInfo.hProcess= 0 then Result:= 0
else Result:= 1;
If Result= 1 then
Repeat
w:= WaitForSingleObject(ExecuteInfo.hProcess, 1000);
Application.ProcessMessages;
Until (Abbruch= True) or (w= WAIT_OBJECT_0) or (w= WAIT_ABANDONED);
// Ergänzung: wenn WaitForSingleObject nicht möglich.
If w= WAIT_ABANDONED then Result:= 0;
end
else
Case GetLastError of
ERROR_FILE_NOT_FOUND,
ERROR_PATH_NOT_FOUND: Result:= -2;
ERROR_NO_ASSOCIATION: Result:= -3;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Abbruch:= false;
Case ExecuteAndWait('E:\Temp\Test.mpg') of
-3: ShowMessage('Keine Programm mit dieser Dateierweiterung verknüpft.');
-2: ShowMessage('Datei nicht gefunden.');
-1: ShowMessage('Datei konnte nicht geöffnet werden.');
0: ShowMessage('Auf Prozess kann nicht gewartet werden.');
1: If not Abbruch then
ShowMessage('Alles OK, ausführendes Programm wurde beendet.')
else ShowMessage('Alles OK, Abbruch durch User.')
end;
end;
Alles anzeigen
---------------
Gruß gispos
Danke für die CODE Formatierung, hatte ich völlig Übersehen.