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!