Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.927 Beiträge
 
Delphi 12 Athens
 
#1

Too stupid to execute and wait

  Alt 9. Aug 2011, 10:14
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.
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 9. Aug 2011 um 11:48 Uhr)
  Mit Zitat antworten Zitat