Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WinExecAndWait Problem (https://www.delphipraxis.net/90265-winexecandwait-problem.html)

stOrM 14. Apr 2007 12:44


WinExecAndWait Problem
 
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!

marabu 14. Apr 2007 13:41

Re: WinExecAndWait Problem
 
Hallo,

ich vermute, dass dein Setup3.exe lediglich ein selbstentpackendes Archiv ist. Nach dem Auspacken wird dann die Kontrolle an das eigentliche Setup-Programm (oder -Script) übergeben und der Entpacker beendet sich. Während die eigentliche Setup-Routine sich gerade anschickt die Arbeit aufzunehemen, startet dein Programm bereits Setup4.

Du musst bei deinem Ansatz darauf achten, dass auch wirklich gleichartige Prozesse ablaufen - oder du musst diese Besonderheiten mit ins Kalkül ziehen.

Grüße vom marabu

stOrM 14. Apr 2007 13:48

Re: WinExecAndWait Problem
 
Zitat:

Zitat von marabu
Hallo,

ich vermute, dass dein Setup3.exe lediglich ein selbstentpackendes Archiv ist. Nach dem Auspacken wird dann die Kontrolle an das eigentliche Setup-Programm (oder -Script) übergeben und der Entpacker beendet sich. Während die eigentliche Setup-Routine sich gerade anschickt die Arbeit aufzunehemen, startet dein Programm bereits Setup4.

Du musst bei deinem Ansatz darauf achten, dass auch wirklich gleichartige Prozesse ablaufen - oder du musst diese Besonderheiten mit ins Kalkül ziehen.

Grüße vom marabu

Da könntest Duz recht haben (bin mir da eigentlich ziemlich sicher)
Hättest Du da vielleicht eine Idee wegen dem Kalkül ... Schwitz...

s!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz