认识InstallShield12
进入公司以来,头一件工作就是接手了公司所有系统平台的打包安装工作,从做这件工作到现在已经有一段时间了,趁着晚上这点闲暇时间,总结一下。
记得刚开始听到InstallShield时,竟不知其为何物!后来缠着InstallShield过了差不多一周时间,才渐渐有了入门的感觉。而今,打包安装工作已经成为日常工作之一了,每天花上不到半个小时的时间即可完成多个安装包的制作及相应升级包的制作。说到这里,特别准备了几个部分,也来说说利用InstallShield12制作安装包的一些方法技巧。今天是第一部分,认识InstallShield12(其实市面上已经有InstallShield2009、InstallShield2010了,只不过本人使用的是InstallShield12,故拿其作为例子)。
在介绍InstallShield12之前,或许很多使用InstallShield工具打包的朋友都应该很清楚,InstallShield方面的高级资料较少,一般的来源可以从InstallShield中文技术论坛(http://installshield.jaron.cn/forum/)、InstallShield公司的社区网站(http://community.flexerasoftware.com/)及英文版的帮助文档找到部分资料。不过,说实在的,真正有帮助的还是相对较少,这其中可能就需要自己去挖掘了。
关于InstallShield12,首先,我们先来看看新建一个InstallScript Project后的界面示意图,如图1.1所示:
图1.1
在图1.1中,这是一个向导式的制作安装包的全过程,如果制作简单的安装包,那么使用这个向导进行Step by step的方式就可以了,而如果要制作较为复杂的安装包或升级包,那么就需要用到Installation Designer面板中的相关操作了,这个在后面再进行阐述。
我们先来看看在Project Assistant面板中每一项的功能:
(1)Application Information:设置安装包的一些基本信息,如公司名称、安装包名称、安装包版本号、公司网站地址等;
(2)Installation Architecture:设置安装包的主体结构,一般用来设置安装包中有多少个安装项目;
(3)Application Files:指定安装文件路径及所需的安装文件夹,在这一步可以通过Add Files或者Add Folders将文件或文件夹添加到指定位置,如Application Target Folder或Program Files或Windows System下等,关于这其中的一些存放目录的区别会在后面进行说明;
(4)Application Redistributables:用于添加第三方组件;
(5)Application Shortcuts:创建程序启动的快捷方式,如开始菜单快捷方式、桌面快捷方式等;
(6)Application Registry:对注册表进行操作;
(7)Installation Interview:一些简单的对话框选择操作,如使用协议、公司名用户名等;
(8)Installation Localization:安装包界面语言的选择;
(9)Build Installation:选择安装包的格式并编译成安装包,如*.exe文件等;
以上是对Project Assistant面板中每一步的基本功能进行了简单的说明,通过这个向导,即可完成一个简单的安装包制作。
下面我们再来看看Installation Designer面板,如图1.2所示:
图1.2
在图1.2中,可以看到,该界面其实就是对Project Assistant面板的细化,对其中的部分功能说明如下:
(1)Installation Information->Project Properties->Setup Languages:设置安装包的语言种类,可以设置多种语言,在运行安装包时会出现安装语言选择界面;
(2)Installation Information->Project Properties->Add or Remove Programs->Disable Change Button:隐藏该安装包在添加删除程序列表中的更改按钮;
(3)Installation Information->Project Properties->Add or Remove Programs->Disable Remove Button:隐藏该安装包在添加删除程序列表中的删除按钮。
(4)Organization->Feature:特征,每个Feature可包含子Feature及若干个Component,每个Feature都会出现在Feature选择界面中,一旦Feature被选择安装其包含的Component就会被安装到系统中去;
(5)Organization->Component:组件,每个Component可设置需要安装的文件、写入的注册表信息、创建的快捷方式等等;通常在这里指定是否卸载、是否注册、安装策略(如果遇到旧版本是全部覆盖还是部分覆盖,是先版本后时间覆盖还是只按版本高低覆盖等);
(6)Organization->Setup Type:安装类型,一般默认有Minimal(压缩)、Typical(典型)、Custom(自定义),每种安装类型包含若干个Feature;
(7)Organization->Setup Design:设置Features、Components(组件)及Files(安装文件)等等。
(8)Application Data->Files and Folders:管理安装文件夹及文件,基本上每次打包都要使用;
(9)Application Data->Objects:选择需要安装的系统运行库。
(10)System Configuration->Shortcuts:创建快捷方式;
(11)System Configuration->Registry:向注册表中添加键值;
(12)System Configuration->XML File Changes:添加或更改XML文件。
(13)Server Configuration->Internet Infosmation Services:配置IIS网站及虚拟目录;
(14)Server Configuration->SQL Scripts:配置数据库,可以支持Microsoft SQL Server, MySQL, and Oracle数据库;
(15)Behavior and Logic->InstallScript:编写安装程序的脚本,这是制作复杂的基于InstallScript的安装包的最常使用的部分;
(16)Behavior and Logic->Support Files/Billboards:添加安装过程中需要的文件及安装背景;
(17)User Interface->Dialogs:编辑安装过程中使用的窗体,在InstallShield12中不包含准备安装窗体和复制文件窗体,所以如果要编辑这两个窗体的界面是很难办到的,至少是不完美的。
(18)Media->Path Variables:编辑安装路径变量;
(19)Media->Releases:制作安装媒体。
(20)Additional Tools->Dependency Scanners:搜索工具;
(21)Additional Tools->Direct Editor:命令编辑器,在这里可以查看或编辑安装程序的各类信息。
通过上面的基本描述,要制作一个安装包,通过最常用的是Installation Information、Organization->Component、Organization->Setup Type、Application Data->Files and Folders、System Configuration->Shortcuts、Behavior and Logic->InstallScript、Media->Releases等部分。
此外,在这里还需要再简单说明一下Application Files中几个目录的区别,首先是Application Target Folder,该目录表示安装包在目标系统中要安装的目录,其根目录可在InstallScript脚本中编写,而用户则可以在安装过程中进行选择并安装到用户想要的目录;Program Files表示目标系统的系统磁盘的Program Files目录,是不允许更改的;Program Files(64-bits)是针对64位系统而言的;Support Folder通常用来存放帮助文档等;Fonts Folder是指目标系统的系统磁盘的字体文件夹目录;Windows System表示的是目标系统的系统磁盘的Windows System目录,如Windows XP的system32目录,也是不允许更改的;Windows System(64-bits)是针对64位系统而言的。
OK,认识InstallShield12就先到这里,在下面的内容中,将会跟各位谈谈InstallScript脚本的编写等问题。
利用InstallScript脚本进行最基本的编程
在公司负责打包安装这份日常工作,同时还负责系统或平台的升级,鉴于公司产品在升级方面要求的特殊性(在B/S上升级C/S程序),本人经过将近一个月的努力,完成了公司产品从最原始的手动升级到半自动化的升级工作,这其中除了需要自己编写升级程序之外,同时还需要结合升级包做相应的工作。
在做安装包或升级包的过程中,很大一部分工作靠InstallScript脚本完成,在这里作简单的总结。
首先,想必接触过InstallShield的朋友都非常清楚,IS有很多的固定函数,这些函数在安装的不同阶段分别执行,比如OnFirstUIBefore、OnFirstUIAfter、OnEnd等。这里需要强调的是,IS函数的执行顺序跟显示顺序是无关的,其执行顺序是已经固化的。
我们可以通过脚本来实现安装界面的增加或减少,比如我们想去掉许可协议界面,那么可以删掉或注释掉OnFirstUIBefore函数中的Dlg_SdLicense2:下的这段代码:
/*
Dlg_SdLicense2:
szTitle = "";
szOpt1 = "";
szOpt2 = "";
//{{IS_SCRIPT_TAG(License_File_Path)
szLicenseFile = SUPPORTDIR ^ "License.rtf";
//}}IS_SCRIPT_TAG(License_File_Path)
//{{IS_SCRIPT_TAG(Dlg_SdLicense2)
nResult = SdLicense2Rtf( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted );
//}}IS_SCRIPT_TAG(Dlg_SdLicense2)
if (nResult = BACK) then
goto Dlg_SdWelcome;
else
bLicenseAccepted = TRUE;
endif;
*/
关于各个函数的用法,可以查看InstallShield的帮助文档,亦可以到网上搜索“InstallShield内部库函数”,这里不作详述。
下面,跟大家分享一些本人在做安装包和升级包过程中所学习或摸索到的一些小技巧。
(1)检测操作系统是否为Windows Vista
if (SYSINFO.WINNT.bWinVista) then
if (SYSINFO.nOSProductType = VER_NT_WORKSTATION) then
// 当前操作系统为Windows Vista
endif;
endif;
(2)注册表操作
读取注册表采用RegDBGetKeyValueEx (szKey, szNumName, nType, svvalue, nSize )函数,写入注册表采用RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue, nSize)函数,删除注册表项采用RegDBDeleteKey ( szSubKey )函数,删除注册表项中某一个键值采用RegDBDeleteValue ( szSubKey, szValue )函数,等等。所有这些都可以方便地通过InstallShield的帮助文档找到相应的使用说明。需要说明的是,如果有多个地方需要进行读注册表或写注册表操作,那么建议将这个方法写成一个自定义的函数,在需要使用的地方就可以非常方便地调用了。另外,还需要注意的是不要忘了在读注册表或写注册表等操作之前加上这句RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE),当然也不用每个地方都加,在一个函数体内只需加一个就够了,而对于特殊情况当然是特殊处理了。
(3)安装完成前执行指定文件
通常,在安装完成之前需要执行指定的文件,如为防止某些文件注册不成功,采用批处理方式进行再一次的注册,这时可以写一个批处理文件*.bat,然后通过如下面的语句执行一下即可:
sProgramme_name = WINSYSDIR ^"\\myReg.bat";
szCmdLine = "";
if LaunchAppAndWait(sProgramme_name, szCmdLine, WAIT) < 0 then;
endif;
(4)隐藏安装文件复制界面
可以在OnMoving函数中编写一行代码:Disable(STATUSOLD)即可实现。
(5)检测磁盘空间是否足够于安装
当安装包非常大时,我们通常要考虑目标计算机的执行磁盘分区是否有足够的空间来顺利完成安装,在这里可以通过GetDisk (szDir, svDrive)、GetDiskSpace (svDrive)函数进行粗略的估算,如下:
GetDisk (szDir, svDrive);
lFreeSpace = GetDiskSpace (svDrive);
if (lFreeSpace < 314572800) then
MessageBoxEx("警告:本安装所需磁盘空间最低约为300M,安装路径所在的磁盘空间不足!请重新选择!","警告",WARNING);
goto Dlg_SdAskDestPath;
endif;
上述代码一般放到OnFirstUIBefore函数的Dlg_SdAskDestPath中。
(6)创建并写数据到文件
有时,为适应实际需要,我们需要在安装过程中创建一个配置文件(如Config.dat),并将一些初始化数据写入该文件中,这时就需要用到CreateFile函数,例程如下:
/* 创建配置文件并写入初始化配置参数 */
szConfigDir = TARGETDIR ^"\\Test\\Start";
szConfigPath= TARGETDIR ^"\\Test";
szConfigFile = "Config.dat";
// 以FILE_MODE_APPEND 方式打开文件
OpenFileMode (FILE_MODE_APPEND);
// 创建配置文件并打开该文件
if (CreateFile (nvFileHandle, szConfigDir, szConfigFile) < 0) then
MessageBox ("创建配置文件失败,安装程序将终止!", SEVERE);
abort;
else
// 将配置数据写入配置文件
szMsg = "[INIT]\n1="+ szConfigPath;
if (WriteLine(nvFileHandle, szMsg) < 0) then
MessageBox ("写入配置参数失败,安装程序将终止!", SEVERE);
abort;
endif;
endif;
CloseFile (nvFileHandle); //关闭文件
以上都是一些最基本的脚本代码,要写好InstallScript脚本,需要在实际工作学习过程中多钻研、多去发现。只要用心,有时候还是可以在InstallShield的技术社区找到一些我们想要的东西,并且会时不时地带给我们一些意外的惊喜。
判断操作系统类型的多种方法
用InstallShield制作安装包时,有时候需要判断操作系统的类型(如Windows XP或者是Windows Vista等),本人通过上InstallShield的官方社区(http://community.flexerasoftware.com/)找到了一些解决办法,现将本人整理过的方法晒出来,与各位一起分享。
方法一:采用注册表的方式进行判断,例程如下:
NUMBER nOS,nvResult;
STRING svOS;
nOS = REGDB_NUMBER;
RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );
RegDBGetKeyValueEx( "SOFTWARE//Microsoft//Windows NT//CurrentVersion","CurrentVersion", nOS, svOS, nvResult);
if (svOS == "6.0") then
MessageBox("We are on Vista!", INFORMATION);
else
if (svOS == "5.1") then
MessageBox("We are on XP!",INFORMATION);
endif;
endif;
方法二:采用GetSystemInfo函数进行处理,请看下面的说明信息:
SYSINFO.nWinMajor:
4 The operating system is Windows NT 4.0.
5 The operating system is Windows Server 2003 R2, Windows Server 2003, Windows XP,or Windows 2000.
6 The operating system is Windows Vista or Windows Server 2008.
SYSINFO.nWinMinor:
0 The operating system is Windows Vista, Windows Server 2008, Windows 2000, or Windows NT 4.0.
1 The operating system is Windows XP.
2 The operating system is Windows Server 2003 R2, Windows Server 2003, or Windows XP Professional x64 Edition.
GetSystemInfo(WINMINOR, nvResult, svResult);
GetSystemInfo(WINMAJOR, nvResult, svResult);
方法二可以通过InstallShield的帮助文档找到更详细的信息。
方法三:通过SYSINFO.WINNT的方法进行判断,例程如下:
if (SYSINFO.WINNT.bWinVista) then
if (SYSINFO.nOSProductType = VER_NT_WORKSTATION) then
// 当前操作系统为Windows Vista
endif;
endif;
if (SYSINFO.WINNT.bWinXP) then
当前操作系统为Windows XP
endif;
上述三种方法是最为常见的解决办法,当然亦可能还有其他的方法可以进行处理。
隐藏准备安装界面
使用InstallShield12制作安装包、升级包的这段时间以来,一直希望能够在安装界面上做点工作,使得安装界面能够更加符合产品应用的实际需求,不过因为资料少及经验不足等原因,一直未能如愿。这两天,在打包过程中,终于发现了一点符合应用的小技巧,特别拿出来分享。
安装包、升级包的要求中有这么一条:需要将准备安装界面隐藏。在查看了InstallShield12的帮助文档及相关资料后,可以通过设置CommandLine参数顺利实现。具体是在Installation Designer->Media->Releases->SINGLE_EXE_IMAGE->Setup Command Line加上/hide_progress即可,如下图:
如果要隐藏整个安装过程,那么将上述的命令改为/s hide_progress即可。
此外,我们通常希望去掉InstallShield Wizard字样,本人看过不少资料,亦按照这些资料中所讲的方法尝试过多次,可惜的是均不能完全实现这一点,部分还是可以去掉的,比如在string tables里面将InstallShield Wizard替换成自己想要的文字(如安装向导),如下图:
同时,可以通过Edit指定对话框,对所需要的对话框做适当的修改,比如修改安装界面左侧的图片等。当然如果修改了对话框,则在我的印象中,对安装包更换皮肤的话,已修改过的界面将保持修改状态,而不会跟着更换皮肤。
由于打包安装工作纯属本人的日常工作,而非本人的工作重心,所以平时在打包安装方面所花的时间和精力相对不足,还有不少地方未能花上足够的时间去深入研究,比如能否根据自己的需求定制每一个安装界面等,如果哪位朋友有这方面的经验,不吝赐教。
常见系统DLL/OCX控件信息汇集
利用InstallShield制作安装包/升级包时,常常需要对控件进行分类,如划分为系统需要注册的控件、系统不需要注册的控件等类别,这就对打包安装开发人员提出了较高的要求,需要自己去判断哪些文件需要注册而哪些文件不需要注册等等。在这里,结合本人在打包安装工作中遇到的问题,将一些常见的与系统相关的或第三方DLL/OCX控件信息整理了一下,与各位朋友分享,如果有错误之处,欢迎指出。
序号 |
DLL文件 |
DLL名称 |
描述 |
属于 |
系统DLL |
是否需要注册 |
安全等级(0-5) |
1 |
asycfilt.dll |
Microsoft OLE DLL |
Microsoft OLE (对象链接和嵌入)特性相关DLL文件 |
OLE |
是 |
是 |
0 |
2 |
comcat.dll |
Microsoft Component Category Manager Library |
Microsoft Component Category Manager Library |
Microsoft® Windows® Operating System |
否 |
是 |
0 |
3 |
gapi32.dll |
Microsoft Mail Configuration Library |
微软邮件协议相关文件 |
Microsoft Exchange |
否 |
是 |
0 |
4 |
msvbvm60.dll |
VB Virtual Machine |
微软Microsoft Visual Basic虚拟机相关模块 |
Visual Basic |
否 |
是 |
0 |
5 |
oleaut32.dll |
Microsoft OLE DLL |
对象链接与嵌入OLE相关文件 |
Microsoft OLE DLL |
否 |
是 |
0 |
6 |
olepro32.dll |
Microsoft OLE Property Support DLL |
对象链接和嵌入OLE特性相关模块 |
Microsoft OLE Property Support DLL |
是 |
是 |
0 |
7 |
riched32.dll |
RichEdit DLL |
字符编辑器相关文件 |
RichEdit |
否 |
是 |
0 |
8 |
richtx32.ocx |
Microsoft Rich Text OLE Control |
微软Microsoft字符编辑器控制相关程序,用于字符对话框对象高级编辑 |
Visual Basic |
否 |
是 |
0 |
9 |
vb6stkit.dll |
Visual Basic Setup Toolkit Library DLL |
Visual Basic应用程序接口API相关文件 |
Visual Basic |
否 |
是 |
0 |
10 |
mscomctl.ocx |
Windows Common Controls ActiveX Control DLL |
公用ActiveX插件控制模块 |
Windows ActiveX |
是 |
是 |
0 |
11 |
comdlg32.ocx |
COMDLG32 OLE Control DLL |
一个ActiveX控制模块,用于通用对话框控制 |
OLE |
否 |
是 |
0 |
12 |
hhctrl.ocx |
Microsoft HTML Help Control |
Microsoft帮助文档界面相关文件 |
Microsoft HTML Help Control |
否 |
是 |
0 |
13 |
mscomct2.ocx |
Microsoft Common Controls 2 ActiveX Control DLL |
ActiveX插件公用管理模块 |
Windows ActiveX |
是 |
是 |
0 |
14 |
msdxm.ocx |
Windows Media Player 2 ActiveX Control |
Windows Media Player播放器ActiveX控制相关文件 |
Windows Media Player |
否 |
是 |
0 |
15 |
msscript.ocx |
Microsoft Script Control |
Visual Basic 6.0应用程序脚本控制的一部分,用于运行时库 |
Visual Basic |
否 |
是 |
0 |
16 |
mswinsck.ocx |
Microsoft Winsock Control DLL |
Visual Basic语言的socket编程相关文件 |
Visual Basic |
否 |
是 |
0 |
17 |
sysmon.ocx |
Microsoft System Monitor Control |
系统性能监视的ActiveX控件 |
Microsoft Windows |
是 |
是 |
0 |
18 |
tabctl32.ocx |
TABCTL32 OLE Control DLL |
一个ActiveX控制模块,用于SSTab控制和Tabbed对话框控制 |
OLE |
否 |
是 |
0 |
19 |
tdc.ocx |
TDC ActiveX Control |
Visual Basic应用程序相关表列数据ActiveX控件模块 |
Visual Basic |
否 |
是 |
0 |
20 |
wshom.ocx |
Windows Script Host Runtime Library |
Windows本地脚本对象运行时相关文件 |
Windows Script Host |
是 |
是 |
0 |