应用InnoSetup制作软件安装程序

应用InnoSetup制作软件安装程序

本笔记记录应用InnoSetup工具创建软件安装程序,也即将编译生成的软件通过打包发布的方式生成windows下的安装文件(.exe文件)。可在windows平台下进行安装并保证安装完成的软件能够正常运行。同时,为美化安装效果,研究了安装界面自定义的相关接口,并形成了一个典型的脚本文件。

一、关于程序的打包发布

在我的笔记《MFC程序打包发布》(https://blog.csdn.net/bjtuwayne/article/details/69140779)中我对程序打包发布的意义做了简单说明:调试完成一个版本的程序后,为了不让用户轻易看到自己的源代码,也算是保护知识产权的一种方式吧;或者想要拿到别的平台去跑,不想Copy工程编译生成,况且别的平台不一定有支持所有插件的环境。以上两个方面问题的一个常见解决办法就是将程序打包发布,生成一个常见的安装文件,让用户自己去安装,最终通过可执行文件来运行程序。

也是在这篇笔记中记录了应用Visual Studio自带的“安装与部署”程序框架创建安装程序。首先个人觉得这种方式过程虽然比较直观,但是比较复杂,不容易被理解接收,而且创建的可安装程序是.msi程序和.exe的可执行程序,不如常见的一个.exe安装程序显得简洁方便。再有,一直对安装过程的界面没有好感,虽然也有美化的方法,但是总觉得较为繁琐。

百度软件打包发布工具,不难发现有一款叫做Setup Factory的软件。我简单尝试了一下,比较方便和直观的配置向导,可以很轻松的实现整个程序的打包发布。默认的安装过程的界面比较普通,应该是可以custom的,但是我没有深入研究。因为很关键的问题是这个软件不是开源的,它是收费的。

于是我辗转又找到了一个叫做InnoSetup的打包软件。稍微研究了一下,便决定用这款工具了。因为首先这是开源软件,网上还有各种大神的加强版可供使用;其次一个突出的优点是它是基于一种语言的脚本编译来实现程序的打包和部署的。这就使得我们可以通过一个脚本举一反三,甚至可以修改脚本私人定制自己的安装流程,包括安装界面的美化。

给一段百科的介绍:InnoSetup是一个免费的安装制作软件,小巧、简便、精美是其最大特点,支持pascal脚本,能快速制作出标准Windows风格的安装界面,足以完成一般安装任务。该软件用Delphi写成,其官方网站同时也提供源程序免费下载。这足以满足个人编写的一些小程序的打包发布了。

二、软件打包的“源文件”

软件开发时由于有软件开发环境,如Visual Studio,Qt等,使得你的可执行文件可以在IDE中运行,如在Visual Studio中点击调试按钮的运行。软件的打包发布则需要满足在没有安装该IDE和相关支持库的环境下运行成功。所以组织软件运行所需要的“源文件”是所有事情的前提。而这个工作几乎所有的软件打包工具都不能帮你完全覆盖,也就是说InnoSetup也不能帮你把程序运行所有的支持全部自动识别且打包进安装程序。这部分工作至少现在在我看来还是需要人工手动添加的。这里我把常见支持软件运行的“源文件”概括为以下几类:

1.可执行文件

在windows下的软件几乎都有一个.exe可执行文件。这个文件通常由编译器编译生成。如在Visual Studio下可在工程目录下的debug和release下分别由一个.exe的可执行文件。这个文件是打包发布的关键文件。如果该执行文件的运行不需要任何支持,那么打包时只需要添加这一个文件就够了,但是实际上这种情况极为少见。通常Debug下的exe文件用以调试用,打包发布时最好用release下的exe文件,后者是经过优化的程序。如果对计算效率要求较高,你会发现这两个版本的运算效率差的不是一星半点儿。

2.界面相关的资源文件

大多软件涉及界面,有界面就会有对应的资源文件。包括图标文件,界面美化的图片等。这部分也是需要打包到安装程序的。

3.库文件

库文件是软件执行必须的支持库。库文件又可以分为3类(我个人的分类):系统运行库、第三方支持库和本地库。系统运行库是指例如VS的运行库(比如Visual C++ 2013 runtime),用vs开发的软件在没有安装VS的平台上很可能需要这个这个库支持。第三方支持库是指别人封装的库文件,例如比较大的Qt库,比较小的skin++库(MFC的界面美化库)以及你在工程里加入的所有库文件。本地库是指自己工程中建立的库工程生成的库文件,例如自己新建了一个运算库工程,生成的动态库被主工程调用,这个运算库工程我称之为本地库。第三方库和本地库又有动态库和静态库之分。动态库需要在打包时将.dll和.lib文件都打包;而静态库则只有lib文件就可以了。

4.第三方插件

不少软件运行时需要有第三方插件的支持,如典型的ocx插件,这类插件有的需要安装,有的需要注册。不论怎样,这类插件支持也必须打包到程序里,并在程序安装时进行插件的安装或者注册。

5.其他

软件的运行除了以上还有其诸如配置文件、数据库文件、运算所需的基础数据文件、license文件等等,这些文件也必须打包进程序,并充分考虑软件运行的工程目录拓扑结构。

综上所述,软件打包发布的“源文件”需要将所有软件运行所需的可执行文件、库文件、资源文件、其他文件等等都打包,且需要在安装过程中对第三方支持库或者插件进行安装注册。可能我们不能一次性到位,其实软件的打包发布也是开发调试的一部分,只能在不停的反复测试和试验中解决问题,一点点将安装软件完善。

三、InnoSetup的使用

假设我们已经准备好了所有的“源文件”,那么下一步则是应用InnoSetup创建安装包程序了。

首先下载InnoSetup,官网下载的是开源的基本版,针对一些高级的功能支持的不是很好。由于是开源软件,自然有各种大神的二次开发版本,而且功能丰富。为了实现将来的私人定制安装流程和界面,这里下载了InnoSetup 5.5.9 加强版Inno Setup v5.5.9 CN byKngStr (build 20180118).exe,在安装时选上加强版5.5.1ee(2)。(不选加强版将来美化安装界面时会有问题)。

安装完毕后,我们首先应用向导创建一个标准的脚本文件。打开软件,点击文件-新建:

下一步:为自己的安装包起个名字,指定版本号等。

下一步:设置软件的默认安装目录,通常我们安装软件在c盘下的Program Files下,所以这里可以默认。如下图配置下,将来软件的安装目录为c:\Program files\MyPro\

下一步:首选选择自己的可执行文件exe文件,可以勾选“允许用户在安装完成后启动应用程序”。在其他应用文件中添加目录,将自己放置好的安装目录选择进行,并在提示获取子目录信息时选择“是”。(之前一定要将自己的工程目录拓扑关系理清楚)

下一步:这一步将设置允许在开始菜单中创建一个目录,目录下存放软件启动快捷方式和卸载快捷方式。这里的设置在将来安装软件时将会提示用户是否要创建。

下一步:这一步可以加载软件的许可文件以及相关信息文件,将在安装过程中显示。

下一步:选择安装过程中界面上的语言。勾选上简体中文。

下一步:第一行指定生成的安装文件的路径,第二行指定生成的安装文件的名字。也可以设置安装文件的图标和安装的密码。

下一步:

直接下一步,然后点击完成,至此已通过向导生成了一个脚本文件。可直接编译该文件,即生成了安装文件。

这个生成的脚本被保存为iss文件,可以用InnoSetup编译、运行和调试。从结构上看页比较清晰:[Setup]字段下是安装基本信息;[Languages]下设置安装语言;[Tasks]下是创建桌面和开始菜单快捷启动方式;[Files]是要打包的源文件;[Icons]定义相关的图标文件。[Run]是安装完毕后运行软件。以上元素构成了一个典型安装软件生成脚本,这些元素也不都是必须的,这在以后的私人定制时再详解。

将该脚本编译通过后,将在配置的指定目录下生成exe安装文件。如本例中在D:\innosetup\rtcds_setup下的rtcds-setup-v0.0.1-x86.exe。可以点击安装测试:



四、支持软件安装和插件注册

运行程序时假如出现了无法运行的问题,请检查你的可执行文件所需的支持“源文件”是否全部覆盖,是否是程序正确的目录拓扑关系,是否将相关运行库安装或者注册。那么问题来了,在上面的向导中并未出现设置软件安装和插件注册的过程配置。这部分内容只好在脚本文件中自己添加或者修改了。

在脚本的[run]字段添加运行指令:

;静默安装vcredist_x86.exe

[Run]

Filename: {app}\bin\c++2008SP1.exe; Parameters: /q; WorkingDir: {app};Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ 2008SP1 Runtime ..."; Check: NeedInstallVC9SP1

Filename: {app}\bin\c++2013.exe; Parameters: /q; WorkingDir: {app}; Flags:skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ 2013Runtime ..."; Check: NeedInstallVC2013

添加[code]字段以检查是否安装了这两个运行库:

[Code]
var
 vc9SP1Missing: Boolean;
 vc2013Missing: Boolean;

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

function NeedInstallVC2013(): Boolean;
begin
 Result := vc2013Missing;
end;

function InitializeSetup(): Boolean;
var
 version: Cardinal;
begin
 if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475}', 'Version', version) = false
 then
   begin
     vc9SP1Missing := true;
   end;

 if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{929FBD26-9020-399B-9A7A-751D61F0B942}', 'Version', version) = false
 then
   begin
     vc2013Missing := true;
   end;
 result := true;
end;

对OCX文件的注册,只需在[source]字段下添加一行该文件复制且注册就好:

[Files]
Source: "D:\RTCDSV1.0\bin\RTCDS.exe"; DestDir: "{app}\bin"; Flags: ignoreversion
Source: "D:\RTCDSV1.0\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\RTCDSV1.0\bin\TeeChart5.ocx"; DestDir: "{app}\bin"; CopyMode:alwaysskipifsameorolder; Flags: restartreplace regserver

以上介绍的安装脚本很传统,感觉现在互联网软诸如QQ之类的,安装风格已经不是这个样子了。现在更倾向于界面简洁化,不要一堆的下一步。另外,会对安装界面进行个性化定制,其实也就是美工。通过修改上述脚本,可以实现私人定制版安装界面和流程。

有必要首先介绍一下几个常用的接口函数:

//该过程在开始的时候改变向导或者向导页,不要指望使用InitializeSetup函数实现改变向导页的功能,因为InitializeSetup函数触发时向导窗口并不存在。
procedure InitializeWizard();

//该函数在安装程序初始化时调用,返回False 将中断安装,True则继续安装.
function InitializeSetup(): Boolean;

//该过程在安装终止时被调用,注意及时在用户没有安装任何文件之前退出也会被调用。
procedure DeinitializeSetup();

 //该过程提供用户完成预安装和安装之后的任务,更多的是提供了安装过程中的状态。参数CurStep=ssInstall是在程序实际安装前,CurStep=ssPostInstall是实际安装完成后,而CurStep=ssDone是在一次成功的安装完成后、安装程序终止前(即点击finish按钮后执行)。
 procedure CurStepChanged(CurStep: TSetupStep);

//当用户单击下一步按钮时调用。如果返回True,向导将移到下一页;如果返回False,它仍保留在当前页。
function NextButtonClick(CurPageID: Integer): Boolean;

//向导调用这个事件函数确定是否在所有页或不在一个特殊页 (用PageID 指定) 显示。如果返回True,将跳过该页;如果你返回False,该页被显示。注意: 这个事件函数不被wpWelcome、wpPreparing 和wpInstalling 页调用,还有安装程序已经确定要跳过的页也不会调用 (例如,没有包含组件安装程序的wpSelectComponents)。
function ShouldSkipPage(PageID: Integer): Boolean;

//在新向导页 (由CurPageID 指定) 显示后调用。

可以看到在上述脚本中就已经应用了InitializeSetup函数。设置断点可以发现在脚本执行时会首先进入该函数。

利用以上函数,借鉴了网上的相关资料,编写了一个美化界面的脚本。该脚本为了实现一键安装的简洁操作,去掉了[languages]和[task]的字段,因为这两个字段往往都带来了下一步操作。然后通过一些指令把中间的一些Pages都禁用。实现欢迎界面之后是安装界面最后是完成安装界面三个步骤即可。

另外在[code]中添加了大量的界面美化的代码,这中间除了各个过程的界面涉及外,很大的工作量在于设计配套的图片。实际上,无论是什么软件的美化,归根到底核心不是软件代码,而是美工的图片和动画设计。

先看下编译完成的安装包安装的效果:(自己的美工图片水平有限。。。)

点击自定义安装后:

点击立即安装后:

 


 

以上涉及到的工具Innosetup和整个生成安装文件的iss脚本可以到https://download.csdn.net/download/bjtuwayne/10361280下载,如有问题欢迎交流。


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjtuwayne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值