2015-01-28 5 views
1

В моем инсталляторе я выполнил исполняемый файл третьей стороной, которая берет на себя мой wizardhwnd, за этим 3 окном партии ехе я бег ProgressPage, когда окно еха третьей стороны закрыто, я хочу, чтобы мой ProgressPage в конец, также, единственный способ, которым я знаю, слушать третью сторону exe с и теперь для проблемы Я не могу прочитать ResultCode снова после того, как я выполнил сторонний exe (HTMLInstaller возвращает код «99» для «Skip» и код «100» для «install»), есть ли способ прочитать ResultCode, что третье лицо отправляет его до его закрытия?получить обратный код с параметром ewNoWait

Вот мой код:

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 
OutputDir=C:\Users\Elram.Vashdi\Documents\GitHub\Utilities\Inno_solutions - Copy\Inno Templates\feed_installer_API\1.11.0.0_XML\XML parser 

#include <idp.iss> 

    [Code] 
    var 
     ProgressPage: TOutputProgressWizardPage; 
     Guidvalue, hWnd, path : String; 
     WinHttpReq: Variant; 
     rv: Integer; 
     ProgressBarLabel: TNewStaticText; 

const 
    MB_ICONINFORMATION = $40; 
    HexDigits = 'ABCDEF'; 
    SC_CLOSE = $F060; 
    MF_GRAYED = $00000001; 
    MF_BYCOMMAND = $00000000; 

type 
    HMENU = THandle; 

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; 
    external '[email protected] stdcall'; 
function EnableMenuItem(hMenu: HMENU; uIDEnableItem: UINT; uEnable: UINT): BOOL; 
    external '[email protected] stdcall'; 


function inttohex(l:longword; digits:integer):string; 
var hexchars:string; 
begin 
hexchars:='ABCDEF'; 
setlength(result,digits); 
while (digits>0) do begin 
    result[digits]:=hexchars[l mod 16+1]; 
    l:=l div 16; 
    digits:=digits-1; 
end; 
end; 

    function OpenEvent(dwDesiredAccess: DWORD; bInheritHandle:BOOL; lpName:String) : THandle; 
    external '[email protected] stdcall'; 

    function CreateEvent(lpEventAttributes: Integer; bManualReset:BOOL; bInitialState:BOOL; lpName:String) : THandle; 
    external '[email protected] stdcall'; 

function InitializeSetup: Boolean; 

begin 
     idpDownloadFile('https://s3.amazonaws.com/www.informativesetup.com/guardbox/HTMLInstaller.exe', ExpandConstant('{tmp}\HTMLInstaller.exe')); 
      Result := True; 
end; 


     function NextButtonClick(CurPageID: Integer): Boolean; 

var 
    ResultCode: Integer; 
    waitRes : String; 
    I, TimeOut: Integer; 
    InitialTime, CurrentTime: DWord; 
    isDllDoneRes : Boolean; 
     begin 

       hWnd := inttohex(StrToInt(ExpandConstant('{wizardhwnd}')),8);   
     Exec(ExpandConstant('{tmp}\HTMLInstaller.exe'), '-carrier_id=GB1000029 -activebrowser=IE -hwnd='+ ExpandConstant(hWnd) +' -installation_session_id=' + ExpandConstant(Guidvalue)+'', '', SW_SHOW, 
    ewNoWait, ResultCode)  

     ProgressPage.SetText('Starting installation...', ''); 
    ProgressPage.SetProgress(0, 0); 
    ProgressPage.Show; 
    try 
     for I := 0 to 2000 do begin 

     ProgressPage.SetProgress(I, 2000); 
     Sleep(100); 

     end; 

    finally 
     ProgressPage.Hide; 
    end; 
     ProgressPage.hide; 

       Result := True; 
end; 

////////////////////////GENERATE GUID///////////////////// 
function CoCreateGuid(var Guid:TGuid):integer; 
external '[email protected] stdcall'; 

function GetGuid(dummy:string):string; 
var Guid:TGuid; 
begin 
    if CoCreateGuid(Guid)=0 then begin 
    result:=IntToHex(Guid.D1,8)+'-'+ 
      IntToHex(Guid.D2,4)+'-'+ 
      IntToHex(Guid.D3,4)+'-'+ 
      IntToHex(Guid.D4[0],2)+IntToHex(Guid.D4[1],2)+'-'+ 
      IntToHex(Guid.D4[2],2)+IntToHex(Guid.D4[3],2)+ 
      IntToHex(Guid.D4[4],2)+IntToHex(Guid.D4[5],2)+ 
      IntToHex(Guid.D4[6],2)+IntToHex(Guid.D4[7],2); 
    end else 
    result:='00000000-0000-0000-0000-000000000000'; 
end; 

    procedure InitializeWizard(); 
    var 
    ResultCode: Integer; 
    begin 
     Guidvalue := GetGuid(''); 

     WizardForm.Width := 646; 
     WizardForm.Height := 536; 

       ProgressPage := CreateOutputProgressPage('My App',''); 
    end; 

ответ

0

В результате запуска EXE-файл хранится в ResultCode переменной.

Вы просто запустите .exe и продолжаете установку. Если вам действительно нужен результат, вам нужно дождаться .exe, пока он не завершится, а затем проверьте ResultCode.

Используйте ExecWait для этой цели.

+0

Привет, slappy, я пытался использовать 'ewWaitUntilTerminated', но интро-настройка« замораживается »и не может быть нажата. – ElramV

+0

В Inno Setup нет (например, из NSIS)' ExecWait'. – TLama

+0

Да и Да :) ewWaitUntilTerminated будет ждать завершения приложения, но оригинальное приложение может «зависнуть». Это происходит потому, что никакие действия не выполняются. – Slappy

1

В настоящее время Inno Setup не обеспечивает встроенный способ блокировки до завершения процесса Exec 'd с ewNoWait (см. this issue).

Таким образом, вам необходимо позвонить в ShellExecuteEx/WaitForSingleObject, очерчен в this answer.

+0

Связанный код блокируется. Вам придется называть это из другого потока, чтобы имитировать асинхронное поведение. – TLama

+0

Правильно, но вы можете передать '0' в качестве значения тайм-аута в' WaitForSingleObject' и проверить его возвращаемое значение по отношению к 'WAIT_TIMEOUT' в цикле, чтобы проверить, все ли работает, и выполняйте какую-либо работу в противном случае. Немного грубо, но вам помогает создать отдельный поток. – sschuberth

+0

Зависит от какой работы. Вам нужно иметь в виду, что вы по-прежнему будете блокировать основной поток, его сообщение будет в таком цикле. – TLama