2015-01-28 4 views
1

내가 인수 제 3 자 exe 파일을 실행 내 wizardhwnd, 나는 ProgressPage 실행이 제 3 자 EXE 창, 제 3 자 exe 인 윈도우가 종료 할 때 내 ProgressPage 원하는 뒤에 끝으로뿐만 아니라 제 3 자 exe를 듣기 위해 알고있는 유일한 방법은 ResultCode이고 이제는 문제가 입니다. 제 3 자 exe를 실행 한 후에는 ResultCode을 다시 읽을 수 없습니다 (HTMLInstaller는 코드 "99"를 반환 함). "건너 뛰기"및 "설치"의 경우 "100"코드), 종료하기 전에 타사 exe가 보내는 ResultCode을 읽을 수있는 방법이 있습니까?GET 리턴 코드 내 설치에

[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

안녕하세요, 나는'ewWaitUntilTerminated'을 사용하려고 시도했지만 inno 설정은 "정지"되어 클릭 할 수 없습니다. – ElramV

+0

Inno Setup에는 NSW가있을 수있는'ExecWait'가 없습니다. – TLama

+0

예, 예 :) ewWaitUntilTerminated는 앱이 끝날 때까지 기다리지 만 원래 앱은 "정지"할 수 있습니다. 이는 아무런 작업도 수행되지 않기 때문입니다. – Slappy

1

Inno Setup은 현재 인 Exec의 프로세스가 완료 될 때까지 차단할 수있는 기본 제공 방법을 제공하지 않습니다 (this issue 참조).

전화 번호 ShellExecuteEx/WaitForSingleObjectthis answer에 직접 설명되어 있습니다.

+0

링크 된 코드가 차단되었습니다. 비동기 동작을 모방하기 위해 다른 스레드에서 호출해야합니다. – TLama

+0

그렇습니다.하지만 WaitForSingleObject에 시간 초과 값으로'0'을 전달하고 루프에서 WAIT_TIMEOUT에 대한 반환 값을 확인하여 프로세스가 아직 실행 중인지 확인하고 그렇지 않으면 어떤 작업을 수행 할 수 있습니다. 약간 미숙하지만 별도의 스레드를 만드는 데 도움이됩니다. – sschuberth

+0

어떤 작업에 따라 다릅니다. 주 스레드 인 메시지 펌프를 계속 차단할 것임을 명심해야합니다. – TLama