Inno setup 使用ewNoWait参数获取返回代码

Inno setup 使用ewNoWait参数获取返回代码,inno-setup,pascalscript,Inno Setup,Pascalscript,在我的安装程序中,我执行了一个第三方exe文件,该文件接管了我的wizardhwnd, 在这个第三方exe窗口后面,我运行了一个ProgressPage,当第三方exe窗口关闭时,我希望我的ProgressPage也结束,我所知道的收听第三方exe的唯一方法是使用ResultCode,现在解决这个问题 执行第三方exe后,我无法再次读取ResultCode(HTMLInstaller返回代码“99”表示“跳过”,返回代码“100”表示“安装”),是否有办法读取第三方exe在关闭前发送的Resul

在我的安装程序中,我执行了一个第三方exe文件,该文件接管了我的
wizardhwnd
, 在这个第三方exe窗口后面,我运行了一个
ProgressPage
,当第三方exe窗口关闭时,我希望我的
ProgressPage
也结束,我所知道的收听第三方exe的唯一方法是使用
ResultCode
,现在解决这个问题 执行第三方exe后,我无法再次读取
ResultCode
(HTMLInstaller返回代码“99”表示“跳过”,返回代码“100”表示“安装”),是否有办法读取第三方exe在关闭前发送的
ResultCode

这是我的密码:

[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 = '0123456789ABCDEF';
  SC_CLOSE = $F060;
  MF_GRAYED = $00000001;
  MF_BYCOMMAND = $00000000;

type
  HMENU = THandle;

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU;
  external 'GetSystemMenu@user32.dll stdcall';
function EnableMenuItem(hMenu: HMENU; uIDEnableItem: UINT; uEnable: UINT): BOOL;
  external 'EnableMenuItem@user32.dll stdcall';


function inttohex(l:longword; digits:integer):string;
var hexchars:string;
begin
 hexchars:='0123456789ABCDEF';
 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 'OpenEventW@kernel32.dll stdcall';

  function CreateEvent(lpEventAttributes: Integer; bManualReset:BOOL; bInitialState:BOOL; lpName:String) : THandle;
  external 'CreateEventW@kernel32.dll 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 'CoCreateGuid@ole32.dll 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;
[设置]
AppName=我的程序
AppVersion=1.5
DefaultDirName={pf}\My程序
OutputDir=C:\Users\Elram.Vashdi\Documents\GitHub\Utilities\Inno\u solutions-Copy\Inno Templates\feed\u installer\u API\1.11.0.0\u XML\XML解析器
#包括
[守则]
变量
ProgressPage:TOutputProgressWizardPage;
Guidvalue,hWnd,path:String;
WinHttpReq:变体;
rv:整数;
ProgressBarLabel:TNewStaticText;
常数
MB_Iconninformation=40美元;
六位数='0123456789ABCDEF';
SC_CLOSE=$F060;
MF_灰显=$00000001;
MF_BYCOMMAND=$00000000;
类型
汉努=坦德尔;
函数GetSystemMenu(hWnd:hWnd;bRevert:BOOL):menu;
外部的GetSystemMenu@user32.dllstdcall';
功能启用项(humenu:humenu;uIDEnableItem:UINT;uEnable:UINT):BOOL;
外部的EnableMenuItem@user32.dllstdcall';
函数inttohex(l:长字;数字:整数):字符串;
var-hexchars:字符串;
开始
hexchars:='0123456789ABCDEF';
设置长度(结果,位数);
当(数字>0)开始时
结果[位数]:=hexchars[l mod 16+1];
l:=l第16部分;
位数:=位数-1;
结束;
结束;
函数OpenEvent(dwDesiredAccess:DWORD;bInheritHandle:BOOL;lpName:String):THandle;
外部的OpenEventW@kernel32.dllstdcall';
函数CreateEvent(lpEventAttributes:Integer;bManualReset:BOOL;BinInitialState:BOOL;lpName:String):THandle;
外部的CreateEventW@kernel32.dllstdcall';
函数初始化设置:布尔;
开始
IDP下载文件('https://s3.amazonaws.com/www.informativesetup.com/guardbox/HTMLInstaller.exe,ExpandConstant({tmp}\htmlinshiller.exe');
结果:=真;
结束;
函数NextButtonClick(CurPageID:Integer):布尔值;
变量
结果代码:整数;
侍者:字符串;
一、 超时:整数;
初始时间,当前时间:DWord;
ISDLdoneres:布尔值;
开始
hWnd:=inttohex(stroint(ExpandConstant({wizardhwnd}')),8;
Exec(ExpandConstant({tmp}\htmlinshiller.exe'),'-carrier_id=GB1000029-activebrowser=IE-hwnd='+ExpandConstant(hwnd)+'-installation_session_id='+ExpandConstant(Guidvalue)+'',SW SHOW,
ewNoWait,结果代码)
ProgressPage.SetText('开始安装…','');
ProgressPage.SetProgress(0,0);
ProgressPage.Show;
尝试
对于I:=0到2000,开始
进度第页。设定进度(2000年第一期);
睡眠(100);
结束;
最后
进行页面隐藏;
结束;
ProgressPage.hide;
结果:=真;
结束;
////////////////////////生成GUID/////////////////////
函数CoCreateGuid(变量Guid:TGuid):整数;
外部的CoCreateGuid@ole32.dllstdcall';
函数GetGuid(伪:字符串):字符串;
var-Guid:TGuid;
开始
如果CoCreateGuid(Guid)=0,则开始
结果:=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);
结束其他
结果:='00000000-0000-0000-0000-000000000000';
结束;
过程初始化Wizard();
变量
结果代码:整数;
开始
Guidvalue:=GetGuid(“”);
WizardForm.宽度:=646;
形状.高度:=536;
ProgressPage:=CreateOutputProgressPage('我的应用','');
结束;

启动.exe文件的结果存储在ResultCode变量中

您只需启动.exe并继续安装。如果确实需要结果,则需要等待.exe完成,然后检查结果代码


为此,请使用ExecWait

Inno Setup当前不提供内置的阻止方法,直到使用
ewNoWait
执行的进程完成(请参阅)


因此,您需要直接调用
ShellExecuteEx
/
WaitForSingleObject
中概述的。

嗨,slappy,我尝试使用
EWAitUnFilterminated
,但inno安装程序得到“冻结”且不可单击inno安装程序中没有
ExecWait
(可能来自NSIS).Yes和Yes:)EWWaitUnterminated将等待应用程序完成,但原始应用程序可以“冻结”。这是因为没有执行任何操作。那么,这种冻结行为是不整洁的,有没有其他方法来侦听第三方exe文件?TLama?你能帮忙吗?链接的代码被阻塞了。您必须从另一个线程调用它来模拟异步行为。是的,但是您可以将
0
作为超时值传递给
WaitForSingleObject
,并在循环中对照
WAIT_timeout
检查其返回值,以查看进程是否仍在运行,或者执行一些其他工作。有点粗糙,但它可以让你创建一个单独的线程。这取决于什么工作。您需要记住,您仍然会阻塞主线程,它的消息泵就在这样的循环中。