在公司负责打包安装这份日常工作,同时还负责系统或平台的升级,鉴于公司产品在升级方面要求的特殊性(在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的技术社区找到一些我们想要的东西,并且会时不时地带给我们一些意外的惊喜。