Hallo,
ich bin zu doof einen Prozess zu aus der Anwendung zu startetn und zu warten bis er beendet ist.
Ich nutze eine modifizierte Version aus der Code lib von EexecAndWait um den Prozess auf zu rufen...aber es ging auch vor den Modifizierungen nicht habe die eingebaut um herauszufinden was da passiert...bzw. um das Ergebniss zu verbessern...erfolglos!
Das verhalten ist wie folgt...
der Prozessstartet und hängt dann! Er wird von WaitforSingleObject scheinbar blockiert. Weiter als bis zum Splahscreen kommt er nicht. Erst wenn ich den startenden prozess beende läuft der gestartetet Prozess durch. Das ist nicht das Verhalten was ich mir wünsche.
Hier der Code zum starten und warten.
Das Programm heißt SFX.exe
Delphi-Quellcode:
function ExecAndWait(Filename, Params: string; WindowState: word = SW_SHOWNORMAL): boolean;
var
ShExecInfo: SHELLEXECUTEINFO;
r : Cardinal;
const
SEE_MASK_NOASYNC= $100;
begin
Result := false;
if Filename = '' then
exit;
if not FileExists(FileName) then
Begin
ShowMessage('Datei nicht existent!');
Exit;
End;
ZeroMemory(@ShExecInfo, SizeOf(ShExecInfo));
ShExecInfo.Wnd := application.MainFormHandle; //GetForegroundWindow;
ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFOA);
ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_NOASYNC;
ShExecInfo.lpVerb := 'open';
ShExecInfo.lpFile := PChar(Filename);
ShExecInfo.lpParameters := PChar(Params);
ShExecInfo.lpDirectory := PChar(ExtractFileDir(Filename));
ShExecInfo.nShow := WindowState;
Result := ShellExecuteEx(@ShExecInfo);
try
if Result then
r := WaitForSingleObject(ShExecInfo.hProcess, INFINITE)
else
Showmessage('Fehler beim Starten der Anwendung:' + Filename +
#13#10'System Fehler: ' + SysErrorMessage(GetLastError));
finally
CloseHandle(ShExecInfo.hProcess);
end;
end;
Der Funktionsaufruf
ExecAndWait(inspath+'\SETUP.EXE','');
Das aufgerufene Programm ist ein Setup.exe ^^
sieht so aus.
Delphi-Quellcode:
program Setup;
uses
dialogs,
SysUtils,
Forms, fmainf;
{$R *.RES}
begin
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
Application.ProcessMessages;
Application.Title := 'Setup';
Application.HelpFile := 'SETUP.chm';//A.R.DB
//Hier würde ein Showmessage noch angezeigt
Application.CreateForm(TFmainf, Fmainf); // Er kommt nur bis hierhin....dann wartet er auf das ende der sfx.exe....total dämlich
//Hier würde ein Showmessage nicht mehr angezeigt
SplashForm.Hide;
SplashForm.Free;
Application.Run;
end.