Hallo,
ich habe folgendes Problem: Von einem Delphi-Programm aus (erstellt mit Delphi 5) starte ich einen Installer mit Hilfe einer Funktion namens WinExecAndWait32. Die Funktion habe ich irgendwo mal runtergeladen. Wie der Name schon sagt startet diese Funktion den Install-Prozess und kehrt erst zurück, wenn dieser beendet wurde. So weit so gut.
Das Problem ist nur, dass der Prozess, der da gestartet wird nicht das eigentliche Installationsprogramm ist, sondern nur mal eine Entpackroutine, die bevor sie beendet wird den eigentlichen Install-Prozess startet. Nun passiert es sehr häufig, dass ungeduldige Benutzer auf meine Oberfläche klicken und dadurch der Installer nun hinter meinem Programm aufgeht und der Benutzer den Installer gar nicht bemerkt.
Um dieses Problem zu umgehen mache ich mein Programm für 15 sec. invisible. Aber je nach Rechner-Geschwindigkeit wird meine Applikation genau dann wieder sichtbar, wenn der Installer auch gerade startet. Manchmal ist dann meine Applikation auch wieder im Vordergrund.
Primitive Lösung: Zeit verlängern. Möchte ich eigentlich nicht. Wenn mit dem Installer was nicht in Ordnung ist, dann dauert es ewig bis mein Programm wieder da ist.
Deshalb meine Frage: Wie bekomme ich die vollständige Kontrolle über den Installer und lasse meine Programm erst dann weitermachen, wenn der vollständige Install-Prozess beendet wurde.
Alternativ würde es mir schon reichen, wenn ich es schaffen würde, dass wenn ich meine Applikation wieder sichtbar mache, dass diese nicht das aktive Programm im Vordergrund wäre.
Hier der Code der Funktion, falls es der Lösung dienen kann:
function WinExecAndWait32(FileName: string; Visibility: integer): integer;
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
ResulA: Cardinal;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then
Result := -1 { pointer to PROCESS_INF }
else begin
while WaitForSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, ResulA);
Result := ResulA;
end;
end;
Bin für eure Hilfe dankbar.
Gruß
Wolfgang
ich habe folgendes Problem: Von einem Delphi-Programm aus (erstellt mit Delphi 5) starte ich einen Installer mit Hilfe einer Funktion namens WinExecAndWait32. Die Funktion habe ich irgendwo mal runtergeladen. Wie der Name schon sagt startet diese Funktion den Install-Prozess und kehrt erst zurück, wenn dieser beendet wurde. So weit so gut.
Das Problem ist nur, dass der Prozess, der da gestartet wird nicht das eigentliche Installationsprogramm ist, sondern nur mal eine Entpackroutine, die bevor sie beendet wird den eigentlichen Install-Prozess startet. Nun passiert es sehr häufig, dass ungeduldige Benutzer auf meine Oberfläche klicken und dadurch der Installer nun hinter meinem Programm aufgeht und der Benutzer den Installer gar nicht bemerkt.
Um dieses Problem zu umgehen mache ich mein Programm für 15 sec. invisible. Aber je nach Rechner-Geschwindigkeit wird meine Applikation genau dann wieder sichtbar, wenn der Installer auch gerade startet. Manchmal ist dann meine Applikation auch wieder im Vordergrund.
Primitive Lösung: Zeit verlängern. Möchte ich eigentlich nicht. Wenn mit dem Installer was nicht in Ordnung ist, dann dauert es ewig bis mein Programm wieder da ist.
Deshalb meine Frage: Wie bekomme ich die vollständige Kontrolle über den Installer und lasse meine Programm erst dann weitermachen, wenn der vollständige Install-Prozess beendet wurde.
Alternativ würde es mir schon reichen, wenn ich es schaffen würde, dass wenn ich meine Applikation wieder sichtbar mache, dass diese nicht das aktive Programm im Vordergrund wäre.
Hier der Code der Funktion, falls es der Lösung dienen kann:
function WinExecAndWait32(FileName: string; Visibility: integer): integer;
var
zAppName: array[0..512] of char;
zCurDir: array[0..255] of char;
WorkDir: string;
ResulA: Cardinal;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then
Result := -1 { pointer to PROCESS_INF }
else begin
while WaitForSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, ResulA);
Result := ResulA;
end;
end;
Bin für eure Hilfe dankbar.
Gruß
Wolfgang
Comment