10. juni 2004 - 08:03
Der er
4 kommentarer og
2 løsninger
Kør setup.exe fra Delphi og vent til endt installation - How?
Hej.
Jeg vil fra Delphi kalde en setup.exe, der installerer en applikation på brugerens PC i baggrunden. Dvs. uden brugeren ved det sker. Dette kan jeg fint gøre ved at kalde:
ShellExecute(Handle, 'open', PChar ('\\server\share\folder\setup.exe'), 'Parametere', '', sw_ShowNormal);
MEN hvordan kan jeg fra Delphi holde øje med, hvornår installationen er kørt færdig på brugerens PC?
Når det sker skal mit Delphi program nemlig lukke.
Når jeg kalder en setup.exe fra Delphi, får Delphi så nogle messages tilbage eller noget i den stil?
Prøv den her:
function ExecuteAndWait(const aFileName: TFileName; nCmdShow: Integer): Boolean;
function doExecAndWait(FileName, Parameter: string; nCmdShow: Integer): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Res: Cardinal;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := nCmdShow;
if not CreateProcess(nil, Pchar(FileName + #32 + '"' + Parameter + '"'), nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
Res := DWORD(-1)
else
begin
while WaitforSingleObject(ProcessInfo.hProcess, 500) = WAIT_TIMEOUT do
Application.ProcessMessages;
GetExitCodeProcess(ProcessInfo.hProcess, Res);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
Result := Res = 0;
end;
var
FileName, FileDir: TFileName;
Res: string;
begin
FileName := ExtractFileName(aFileName);
FileDir := ExtractFilePath(aFileName);
SetLength(Res, MAX_PATH);
FindExecutable(pointer(FileName), pointer(FileDir), pointer(Res));
SetLength(RES, Pred(Pos(#0, Res)));
Result := doExecAndWait(RES, aFileName, SW_SHOWNORMAL);
end;
Uha I er hurtige. :o) Og det virker! Der er ikke et øje tørt.
Jeg brugte et af dine links Snowball, men jeg er overbevist om, at borrisholt's også virker. Så I deler.
Mange tak for hjælpen.