InstallShield X制作安装程序杂记(前言)
公司要做一个应用软件产品包装,产品本身的质量,实在是不好意思说什么,那就不说了。我的任务就是要把这个产品包装得大气一点。软件的安装程序制作,有很多工具可以使用,但头儿指定了InstallShield X,那咱就硬着头皮上吧!(以下简称X)
X的安装,一看就与众不同,蓝色的背景,感觉很新颖。对于这个新版的安装制作工具,对我还是有很大的吸引力的。而正因为是‘新版本’,其组织结构和以前的版本有很大不同,所以可查的资料很少,无论是英文还是中文。当时只有http://blog.joycode.com/hopeq/archive/2004/08/02/29325.aspx
上有一点比较简单的介绍,所以主要还得靠自己了,经过大概一周的努力,遇到不少问题,总算是把一个比较常见的完整安装过程完成了。写下这些东西的目的,不光是给自己记录,还可以给像我当时那样的新手以一定的参考。文章组织也许不是很有逻辑性,所以叫‘杂记’,只要能给别人有一点用处,不至于误导,我心足矣。如果有不正确的地方,还请大家指出。
说明:本人的安装工程是ScriptInstallProject,所以文中的视图、功能项均以ScriptInstallProject为准。
InstallShield X制作安装程序杂记(1.视图概貌)
把视图篇写在首位,主要是我当时在看帮助的时候,看到很多诸如installscript view,dialog view之类的字眼,可我在面板上不能很快的找到,好像这帮助写的不是这个版本似的,这让我感觉很郁闷。而后来发现,这还是和不熟悉有很大关系。废话少说,咱们先来看看视图。
打开菜单View,第三个菜单项为View Bar,点击之后,在窗口左边会出现一个视图列表条,分Installshield,View list steps和Workspace三栏,Installshield栏中主要是一些简介、帮助信息,不必多看。View list steps里面即是installation Designer中的一级视图导航。Workspace栏,这正是关键所在。我所疑惑的帮助中所说的view,指的就是这里,这里列出了常用的二级视图。请记住:View Bar
另外一个重要的视图是Project Assistant(工程助理视图),在Workspace栏中有入口,但是可能出现你点击了那个按钮,却没有任何反应的情况,是为什么呢,原来问题还在View菜单,看最后一个菜单项Project Assistant,把它选中就可以了。
主工作区,有几个切换页(Start page/Project Assistant/Installation Designer)Start Page是可以不用看,其中Installation Designer是最主要的工作视图。
本篇主要给新手刚进入系统进行环境熟悉,具体视图的内容,将在后面的文章进行介绍。
InstallShield X制作安装程序杂记(2.Installation Information节点)
Installation Information,即安装信息。
(一).General Information:
1. Project Properties,
Author Name中填写作者姓名;Setup Languages,下面会列出一个语言列表,你可以根据需要进行勾选,InstallShield X默认的语言是English,如果你只要简体中文的话,需要先选中Chinese(Simplified),然后把在‘String Tables’下把Chinese(Simplified)设置为默认(点击右键,Make Default),再把English从列表中去掉。如果选择了多种语言,安装时会出现语言选择对话框。
PlatForms 选择这个安装程序可以在哪些操作系统中进行安装。
2.Add or Remove Programs:这栏信息与控制面板->添加/删除程序相关
Display Icon:选择在‘添加/删除程序’列表中显示的图标
Disable Change Button 是否让‘添加/删除程序’列表中的‘更改’按钮是否无效,默认为NO,即不Disable,有效。
Disable Remove Button 是否让‘添加/删除程序’列表中的‘删除’按钮是否无效,默认为NO,即不Disable,有效。
Publisher/Product URL 发行商/产品 网址
Read Me 可以填写readme文件名。
。。。接下来的几个都是类似的信息,不再一一列出,这些信息,将在‘添加/删除程序’列表中点击‘支持’信息弹出的对话框中出现。
3.Product Properties 产品属性
这个很简单,挑几个重要的说说:
TARGETDIR 目标文件夹。比如
<FOLDER_APPLICATIONS>\<IFX_COMPANY_NAME>\<IFX_PRODUCT_NAME> 这几个括号中的是变量。分别代表应用 程序文件夹\公司名称\产品名称,你也可以修改这个值,如去掉公司名称变量。
Executable File 主程序名称
Application Type 应用程序类型 我选的是Standard Windows Application 。这个值有对安装有什么影响,还没有试验。
4.String Tables 字串表。
点击下面的Chinese(Simplified)节点,可以看到字符定义表,这些变量,可能影响你安装的显示。你可以进行相应的修改、添加。
(二)Update Service更新服务 如果选了Enable Update Service为True,可以设置Host(主机)/Update Check Interval(更新检查间隔时间)等来配置更新服务。这个功能,由于我还没有加以试验。先不多说,以后再补充。
InstallShield X制作安装程序杂记(3.Orgnization节点)
(一)Setup Design 安装设计,这个节点实际是Features和Components的一个树结构
(二)Features 这个节点很重要。不知怎么翻译比较好,暂且叫‘安装部分’比如你的软件有几个部分,可以由用户选择安装,就需要在这里分别设置。各个Features之间可以有依赖关系,一个Features可以包括多个Components。(通过new Component就可以建立。) 从用户角度来看,这是产品的最小组成部分。
(三)Components 安装零件。可以是文件、快捷方式、注册表项等。多个Components组成一个Feature,从制作者角度来看,是安装程序的最小组成部分。
(四)Setup Types 安装类型。可以在这里维护安装类型,比如添加一个‘完整安装’,‘自定义安装’,‘最小安装’等。这个节点很简单,点击每个安装类型,可以选择相应的Feature,右边可以设置显示和描述的文字。
InstallShield X制作安装程序杂记(4.Application Data节点)
1.Files and Folders(文件与文件夹):这个一看就明白,有四个区域Source computer's folders(源机器文件夹,即制作安装程序的机器中的文件夹),Source Computer's files(源文件,列出源文件夹中的文件)
Destination computer's folders(目标机器文件夹,即要安装的机器上的文件夹),Destination computer's files(目标文件)。
(1) 前两个,跟资源管理器没多大区别,重点说说Destination computer's folder,这里一般会列出[AppDataFolder],[Common FilesFolder],[INSTALLDIR],如果需要其他文件夹,可以通过在根节点Destination Computer上点击右键->Show Predifined Folder来选择,这样就可以把文件安装到相应的系统预定义文件夹中。
(2) 对于一般的安装制作,用最后一个就可以。方法:在Source computer's folders中选定源文件夹,按紧鼠标,拖拽到[INSTALLDIR]节点下面,拖拽过来时,会弹出一个对话框,询问你是否要使用动态文件链接,我建议采用动态文件链接,这样,如果源文件发生了变化,都可以在编译时自动更新。接下来还会出现一个对话框,可以设定是否包含子目录(Include subfolders),是否自动注册所有的文件(Self-Register all files)等,一般说来,按Y,然后按一个OK就可以了。
(3) 如果要指定目的文件夹的读写权限,通过右键->Properties->Permissions来进行设置。
(4)一旦加入了文件夹,InstallshieldX就自动建立了一个Component,上一篇中已经说明了Component和Feature的关系。所以这里,特别要注意的是,要看清楚最上面的那一行字“Add new components to the feature”后面的下拉框,(2)中的文件,将和指定的Feature相关联,如果这里指定得不对,假如用户没有选定这个Feature,那这些文件就不会安装到指定的目录。
2.Redistributables: 直译是‘重新分配表’,我理解的就是安装所需要的一些附带包,可以翻译为‘分发包’点击就可以看到一个列表,把需要的包打勾就可以。
InstallShield X制作安装程序杂记(5.System Configuration节点)
1.Shortcuts(快捷方式):快捷方式主要是以下几个地方:
Start Menu(开始菜单)/Programs Menu(程序菜单)/Startup(启动)/Desktop(桌面)
(1)Start Menu,如果你装了UtraEdit就知道了,点击开始菜单,在上方就可以看到,这是比较cool的一种方式,堪称最快捷。而且很多软件都不往那里装,比较显眼,好找。
(2)Programs Menu,是大多数软件都采用的快捷方式位置,即在开始->程序中所列出。
(3)Startup,如果你的软件希望用户开机就运行,可以在这里建立,位于开始->程序->启动。
(4)Desktop,在桌面创建快捷方式。
几种快捷方式的配置方式都一样,在相应节点上点击右键,有一个New Shortcut(但我这里不知道什么原因该项无效),我使用的是New Advertised Shortcut,建立以后,右边会出现一个Key-Value表项,这里挑几个说说。
Display Name:快捷方式的名称。
Target:这里写快捷方式指向的文件名,对应快捷方式中的“目标”。比如<TARGETDIR>\bin\pmain.exe
Arguments:参数。比如主程序的运行参数是pmain -start,那这里就填写-start。
Working Directory:对应快捷方式中的“起始位置”,比较重要,如果不设置,而程序中使用GetCurrentPath可能获得的是快捷方式所在的位置(如桌面,而不是目标所在目录),从而导致程序路径错误。对应上面的Target,这里应该填写 <TARGETDIR>\bin。
2.Registry(注册表):可以把一些信息写入注册表。这个节点的工作区布局,和上篇所说的Files and Folders很相似,上面是源(Recource),下面是目的(Destination),如果要复制注册表项名称,用法很简单,在Source computer's Registery view中选定要修改的注册表项,按紧鼠标,拖拽到Destination computer's Registry中的相应节点中就可以;如果要新建表项,在Destination computer's Registry节点中点击右键,new->Key,如果要指定key值,使用相应的菜单项,跟在注册表中直接操作差不多,这里就不多说了。
----以下几个节点在MSI Project中有,InstallScript Project中却没有。关于××× Project,我一直很困惑,我到时专门写一个文章,提出我的困惑。
3.ODBC Resources(ODBC 源)
4.INI File Changes(ini文件更改)
5.Environment Variables(环境变量)
这几个节点的配置很简单,我就不说了。
InstallShield X制作安装程序杂记(6.Server Configuration节点)
1.Internet Information Services(IIS配置):主要是给Web项目制作使用的。
这里有一个根IIS Configuration,右键->Add web side(建立web站点),建立站点时候,可以在站点上面建立虚拟目录(New Virtual Directory)。右边的Key-Value表中有很多条目,只要你会设置IIS,这些都是小菜了。
2.SQL Servers(MS SQL Server配置):用于SQL Server的配置,我看了一下,好像可以通过SQL脚本(script)在安装时建库,建表等。一言以蔽之,可以作为数据库的初始化。
在根节点SQL Servers上,右键->new SQL Connection,填写相应数据即可。
--这个大节点,我没有实际测试,不过比较简单,属于一看就明白的,就不一一翻译了,有问题单独交流。
InstallShield X制作安装程序杂记(7.Behavior and Logic节点)
1.InstallScript(安装脚本):安装文件是InstallScript Project的重头戏,可以通过编写安装脚本文件,来对安装程序进行深层次的处理。其中提供了一些标准函数、事件,也可以自定义函数,代码风格有点类似C。
如何使用脚本来“滋润”安装程序,后文将用专门篇幅实例说明。
2.Support Files/Billboards(支持文件,后面的不知道咋翻译好):一些安装过程中需要读写的文件,可以添加到这里。后文实例中将有说明。
InstallshieldX安装制作杂记(实例之安装完成)
我们可以看到,很多软件在安装完成之后,可以有一些选项,比如“查看ReadMe”,“运行程序”等等,这是怎么做到的呢?
关键词:OnMoved、SdFinish
1.InstallShieldX脚本中有一个OnMoved事件。这个事件在需要安装的文件拷贝完成之后触发;
2.SdFinish是一个标准对话框函数,函数原型为SdFinish ( szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2 );从参数中可以发现,这里只提供最多两个选项。
实例代码如下:
function OnMoved()
STRING szTitle;
STRING szMsg1, szMsg2,szOpt1,szOpt2;
BOOL bvOpt1, bvOpt2;
STRING szApplicationPath,szApplicationCmdLine,szCmdLine;
begin
if (MAINTENANCE) then return 0;endif;//如果不是安装状态,比如修改/卸载状态的时候,则不执行。
szTitle = "安装完成";//对话框的标题
szMsg1 = "%P 安装已经完成.\n" +
"请根据需要选择下面的选项.";//%P为软件产品名称
//如果要单独在这里设置产品名称,在之前使用如下两句
// szProductName = "某某软件";
// SdProductName (szProductName);
szMsg2 = "点击‘完成’按钮完成%P安装.";
szOpt1 = "阅读自述文件";//如果这里为空,则表示只有一个选项
szOpt2 = "运行程序";
SdFinish (szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2);
if (bvOpt1) then
LaunchApp ('notepad.exe',TARGETDIR ^ "\\readme.txt");//LaunchApp 用来运行某外部程序
endif;
if (bvOpt2) then
LaunchApp (TARGETDIR ^ "\\App.exe","");
endif;
end;
InstallshieldX安装制作杂记(经验点滴)
1. 安装类型:
Universal Project是为了适应不同操作系统而作。
InstallScript Project最为灵活,Windows Installer页中的project需要 windows installer server 支持,但有速度快,文件小的优点。
2. InstallScript MSI project 可以转换为InstallScript Project:菜单project->Convert to InstallScript Project.
3.常用函数:
NumToStr,StrToNum 整型和字符串相互转换。
InstallshieldX安装制作杂记(实例之自定义对话框)
如何调用自定义对话框?Installshield帮助中有说明,但有一些环节弄不好就无法实验成功。比如ControlID,DialogID等。
通过自己的摸索,我完成了自定义对话框的建立、事件编写已经调用,现整理出来,希望能给大家提供帮助。
1.新建对话框
(1)在User Interface->dialogs中新建一个Dialog,命名为fbysssDialog;
(2)通过Control tool bar加入一个Text Area,Text属性填入"我的自定义对话框";
(3)加入三个Push Button,分别设置Text属性为Back,OK,Next,Control Identifier分别设置为14,13,15。其他控件可以根据需要添加;
(4)Additional Tools->Direct Editor找到Dialog,设置fbysssDialog的ISResourceID为10333(如果有重复就改变数字)。
2.编写对话框事件
新建一个脚本文件,命名,比如叫"fbysssDialog.rul"
粘贴如下代码:
#define RES_DIALOG_ID 10333//对话框的ID
#define RES_PBUT_NEXT 15 // Next 按钮的ID
#define RES_PBUT_OK 13 // OK按钮的ID
#define RES_PBUT_BACK 14 // BACK按钮的ID
#include "Ifx.h"
export prototype ExFn_DefineDialog(HWND);
function ExFn_DefineDialog(hMSI)
STRING szDialogName, szDLLName, szDialog;
NUMBER nDialog, nResult, nCmdValue;
BOOL bDone;
HWND hInstance, hwndParent;
// STRING sValue;
begin
szDialogName = "fbysss的自定义对话框";
hInstance = 0;//默认值
szDLLName = ""; ////默认值
szDialog = "";//如果指定了对话框的ID,这里就设置为空字符串。
hwndParent = 0;//保留参数,必须为0
nResult = DefineDialog (szDialogName, hInstance, szDLLName,
RES_DIALOG_ID, szDialog, hwndParent,
HWND_INSTALL, DLG_MSG_STANDARD|DLG_CENTERED);
// 错误检查
if (nResult < 0) then
MessageBox ("出错了.", SEVERE);
bDone = TRUE;
abort;
endif;
bDone = FALSE;
//循环
repeat
//显示对话框,nComValue返回在对话框中的事件,如果正常,返回Control ID
nCmdValue = WaitOnDialog(szDialogName);
//NumToStr(sValue,nCmdValue);
//MessageBox(sValue,INFORMATION);
switch (nCmdValue)
case DLG_CLOSE:
// 关闭窗口
Do (EXIT);
case DLG_ERR:
MessageBox ("无法显示自定义对话框,安装取消.", SEVERE);
abort;
case DLG_INIT: ;
//初始化,啥不不干
case RES_PBUT_OK:
// OK按钮被按下
MessageBox("OK按钮被按下了。",INFORMATION);
case RES_PBUT_NEXT:
MessageBox("Next按钮被按下了。",INFORMATION);
bDone = TRUE;
case RES_PBUT_BACK:
MessageBox("BACK按钮被按下了。",INFORMATION);
bDone = TRUE;
endswitch;
until bDone;
//关闭对话框
EndDialog (szDialogName);
//释放内存
ReleaseDialog (szDialogName);
end;
3.调用对话框
在Setup.rul头部加入#include “fbysssDialog.rul“
ExFn_DefineDialog(0);//调用,这句话根据需要写在相应的地方。比如一开始就显示,写在function OnFirstUIBefore() 的begin之后。
编译运行,是不是看到效果了?cool!