zoukankan      html  css  js  c++  java
  • 如何用inno setup打包activex

    需要解决三个问题,运行环境检测与安装,按顺序执行安装,activex注册。

    运行环境检测与安装

    最开始的方法,百度之后,根据网上的搜索的结果,使用了
    RegQueryDWordValue(HKLM, 'SOFTWAREMicrosoftWindowsCurrentVersionUninstall{9A25302D-30C0-39D9-BD6F-21E6EC160475}', 'Version', version),最后的结果,我发现,跟我想的不一样,没有判断到是否已经安装了vc++9的环境,每次安装都会重复安装,最后,我发现,Uninstall中的GUID是不固定的,在不同的机器上面,安装之后,它会改变,原因不知。只好bings和google,
    最后看了
    http://blogs.msdn.com/b/astebner/archive/2010/10/20/10078468.aspx里面的How to detect the install state for the Visual C++ 2010 redistributable packages等文章,决定使用作者的办法。那就是调用msi.dll里面MsiQueryProductState函数。
    我又在在传入值上面,又思考了半天,因为我用了作者提供的GUID号,返回值均为-2,而我的确已经安装了此产品了,我想可能是因为作者提供的产品GUID都与我手头上打包的x86.exe或者是x64.exe里面的产品GUID不一样,怎么看到这两个产品的GUID了,本人笨的很,只好装了一个wix的打包工具,解压缩这两个exe,然后,再看它们的wix格式的文件,最后在第一行看到了产品的GUID,跟作者提供的不一样,跟网上的那个GUID号也不一样。

    静默安装

    我在上面的文章里面看到了参数,不会用,最后查看了Exec的使用方法,才明白了,应该怎么写。

    按顺序执行安装


    开始写的是Files里面,自动注册activex,但结果经常会,运行环境还没有安装,就注册activex了,往往注册不成。
    改为不让dll自动注册了,在安装完成之前,使用
    RegisterServer(Is64BitInstallMode, ExpandConstant('{app}SISSWebUKey.dll'), False);来进行注册。

    整个安装打包文件如下

    #define MyAppName "安全登录 for  IE (64)"
    #define MyAppVersion "2.0.0.1"
    #define MyAppPublisher "公司名"
    #define MyAppURL "www.demo.com"
    #define MyAppExeName "test.dll"

    [Setup]
    ; 注: AppId的值为单独标识该应用程序。
    ; 不要为其他安装程序使用相同的AppId值。
    ; (生成新的GUID,点击 工具|在IDE中生成GUID。)
    AppId={{CBA6F794-BD25-45A2-9A91-8F11C3A2E3BA}
    AppName={#MyAppName}
    AppVersion={#MyAppVersion}
    ;AppVerName={#MyAppName} {#MyAppVersion}
    AppPublisher={#MyAppPublisher}
    AppPublisherURL={#MyAppURL}
    AppSupportURL={#MyAppURL}
    AppUpdatesURL={#MyAppURL}
    DefaultDirName={pf}{#MyAppName}
    DisableDirPage=yes
    DefaultGroupName={#MyAppName}
    DisableProgramGroupPage=yes
    OutputDir=D:work2013projectInstallFile
    OutputBaseFilename=SISSUKeySetup64
    Compression=lzma
    SolidCompression=yes
    ArchitecturesInstallIn64BitMode=x64
    PrivilegesRequired=admin
    [code]
    #IFDEF UNICODE
      #DEFINE AW "W"
    #ELSE
      #DEFINE AW "A"
    #ENDIF

    function MsiQueryProductState(ProductCode: string): integer;
      external 'MsiQueryProductState{#AW}@msi.dll stdcall';
    function MsiConfigureProduct(ProductCode: string;
      iInstallLevel: integer; eInstallState: integer): integer;
      external 'MsiConfigureProduct{#AW}@msi.dll stdcall';
    var

    HasRun:HWND;
    var vc9SP1Missing: Boolean;
    function InitializeSetup: Boolean;
    var Path:string ;
    ResultCode: Integer;
    var
    IniFile, OldString, NewString: string;
    IniFileLines: TArrayOfString;
    i: Integer;
    currentIndex: Boolean;
    var version: Cardinal;
    begin
    Result := true;
    HasRun := FindWindowByClassName('IEFrame');
    while HasRun<>0 do

    begin

        if MsgBox('安装程序检测到IE浏览器正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then

        begin

          Result := false;

          HasRun := 0;

        end

        else

        begin

          Result := true;

          HasRun := FindWindowByClassName('IEFrame');

        end;

    end;
        //这里的GUID号需要自己查看下载的vcredist_x64.exe是否是此GUID
      if MsiQueryProductState('{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}') <> 5 then begin
         vc9SP1Missing := true;
      end;
     
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
     var
    pt,IniFile, OldString, NewString: string;
    IniFileLines: TArrayOfString;
    ResultCode,i: Integer;
    currentIndex: Boolean;
    begin
      if (CurStep=ssPostInstall) then  
    begin
       if(vc9SP1Missing=true) then
        begin
          pt:=  ExpandConstant('{tmp}vcredist_x64.exe');//需要考虑返回值 0 ,是安装成功不需要重启 3010安装成功需要重启电脑 其它的是安装失败
         if( not Exec(pt,'/passive /norestart"','',SW_HIDE,ewWaitUntilTerminated,ResultCode)) then     
            begin
              MsgBox('C++运行环境安装失败,请手动安装!没有此控件,安全控件无法安装成功!', mbInformation, MB_OK);
            end;
        end;
    end;
      if(CurStep=ssDone) then  
      begin
        RegisterServer(Is64BitInstallMode, ExpandConstant('{app} est.dll'), False);
      end;
    end;

    function NeedInstallVC9SP1(): Boolean;
    begin
      Result := vc9SP1Missing;
    end;

    function InitializeUninstall(): Boolean;
     var
     HasRun : Integer;
     begin
       Result := true;
       HasRun := FindWindowByClassName('IEFrame');
       while HasRun<>0 do

    begin

        if MsgBox('安装程序检测到IE浏览器正在运行。' #13#13 '您必须先关闭它然后单击“是”继续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then

        begin

          Result := false;

          HasRun := 0;

        end

        else

        begin

          Result := true;

          HasRun := FindWindowByClassName('IEFrame');

        end;

    end;
       
     end;

    [Languages]
    Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"


    [Files]
    Source: "D:work2013projectOldKey64NeedLibvcredist_x64.exe"; DestDir: "{tmp}"; Check: NeedInstallVC9SP1
    Source: "D:work2013projectOldKey64SISSWebUKeySISSWebUKeyRelease est.dll"; DestDir: "{app}"; Flags: promptifolder restartreplace
    ; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”

    [UninstallRun]
    Filename: "regsvr32"; Parameters:"{app} est.dll /u /s "
    [UninstallDelete]
    Type: files; Name:"{app} est.dll"

  • 相关阅读:
    SpringBoot入门教程(十六)@Autowired、@Inject、@Resource
    SpringBoot入门教程(十五)集成Druid
    SpringBoot入门教程(十四)导出Excel
    SpringBoot入门教程(十三)CORS方式实现跨域
    SpringBoot入门教程(十二)DevTools热部署
    SpringBoot入门教程(十一)过滤器和拦截器
    1 谷歌book初始化配置-开启开发者模式
    47 VNC远程桌面
    46 温湿度传感器 dh11
    博士毕业要求
  • 原文地址:https://www.cnblogs.com/forhell/p/3256423.html
Copyright © 2011-2022 走看看