Thema: Delphi WinExecAndWait Problem

Einzelnen Beitrag anzeigen

Benutzerbild von stOrM
stOrM

Registriert seit: 7. Jun 2003
Ort: Mülheim an der Ruhr
436 Beiträge
 
Delphi 10.3 Rio
 
#1

WinExecAndWait Problem

  Alt 14. Apr 2007, 12:44
Hi,
ich hab da folgendes Problem, ich versuche gerade eine Listbox zu füllen (Multiselect = True)
Die Listbox enthält diverse Programme (ermittelt via SearchRec)
Die Programme die in der Listbox enthalten sind besitzen alle ein Setup.

Wenn der User nun mehrere Programme in der Listbox ausgewählt hat, sollte eins nach dem anderen installiert werden... Also mit dem ersten beginnend, wenn das erste Programm fertig installiert ist, sollte das 2. Setup automatisch starten usw...
Für das ganze habe ich nun die Funtion ExecAndWait verwendet, seltsamerweise läuft beim ersten Setup noch alles normal, es kommt aber komischerweise vor das z.B. beim start von Setup3 die folgenden Setups gleich mitaufgerufen werden und installieren wollen was logischerweise nicht dem entspricht was ich wollte. Ich hab keine Ahnung wo der Fehler sein soll, da die ersten beiden Setups ablaufen wie gewollt (nacheinander) gibt es eventuell eine andere sicherere Methode als die folgende Funktion die ich irgendwo gefunden habe?

Delphi-Quellcode:

function ExecAndWait(ExecFile:PChar; TimeOut:Word; AllowKill:Boolean; Show:Boolean):Integer;
var
  PROCESSINFO : TProcessInformation;
  STARTUPINFO : TStartupInfo;
  lpExitCode : Cardinal;
  Msg : TMsg;
  sTime : TDateTime;
  hrs,mins,secs,msecs: Word;

begin
  sTime:=SysUtils.Time;
  Result := 0;
  With STARTUPINFO do begin
    cb := SizeOf(STARTUPINFO);
    lpReserved := nil;
    lpDesktop := nil;
    lpTitle := nil;
    dwFlags := STARTF_USESHOWWINDOW;
    lpReserved := nil;
    cbReserved2 := 0;
    lpReserved2 := nil;
    If Show then
      wShowWindow := SW_NORMAL
    else
      wShowWindow := SW_HIDE;
  end;
  If CreateProcess(nil,ExecFile,nil,nil,False,NORMAL_PRIORITY_CLASS,nil,nil,
                   STARTUPINFO,PROCESSINFO) then begin
    Repeat
      While PeekMessage(Msg,0,0,0,PM_REMOVE) do begin
        If Msg.message = WM_QUIT then Halt(Msg.wParam);
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
      GetExitCodeProcess(PROCESSINFO.hProcess,lpExitCode);
      decodetime (sysutils.time-stime,hrs,mins,secs,msecs);
      hrs:=hrs*60+mins;
      hrs:=hrs*60+secs;
      If (TimeOut > 0) and (TimeOut < hrs) then begin
        Result := 1;
        If AllowKill then begin
          If TerminateProcess(PROCESSINFO.hProcess,0) then
            Result := 2
          else
            Result := 3;
        end;
        Break;
      end;
    Until lpExitCode <> STILL_ACTIVE;
    With PROCESSINFO do begin
      CloseHandle(hThread);
      CloseHandle(hProcess);
    end;
    If Result = 0 then Result := lpExitCode;
  end
  else Result := GetLastError;
end;
Ggf. hat jemand auch einen anderen Lösungsansatz für mein Problem...?
Vielen Dank
s!
  Mit Zitat antworten Zitat