Chinaunix首页 | 论坛 | 博客
  • 博客访问: 677657
  • 博文数量: 35
  • 博客积分: 7010
  • 博客等级: 少将
  • 技术积分: 1772
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-30 16:52
文章分类

全部博文(35)

文章存档

2008年(35)

我的朋友

分类: WINDOWS

2008-03-03 15:09:34

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 stepsWorkspace三栏,Installshield栏中主要是一些简介、帮助信息,不必多看。View list steps里面即是installation Designer中的一级视图导航。Workspace栏,这正是关键所在。我所疑惑的帮助中所说的view,指的就是这里,这里列出了常用的二级视图。请记住:View Bar

      
另外一个重要的视图是Project Assistant(工程助理视图),在Workspace栏中有入口,但是可能出现你点击了那个按钮,却没有任何反应的情况,是为什么呢,原来问题还在View菜单,看最后一个菜单项Project Assistant,把它选中就可以了。

      
主工作区,有几个切换页(Start page/Project Assistant/Installation DesignerStart 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 
目标文件夹。比如
\\   
这几个括号中的是变量。分别代表应用 程序文件夹\公司名称\产品名称,你也可以修改这个值,如去掉公司名称变量。
 Executable File
主程序名称 
Application Type
应用程序类型 我选的是Standard Windows Application 。这个值有对安装有什么影响,还没有试验。

4.String Tables
字串表。
 
点击下面的Chinese(Simplified)节点,可以看到字符定义表,这些变量,可能影响你安装的显示。你可以进行相应的修改、添加。
  
(二)Update Service更新服务   如果选了Enable Update ServiceTrue,可以设置Host(主机)/Update Check Interval(更新检查间隔时间)等来配置更新服务。这个功能,由于我还没有加以试验。先不多说,以后再补充。

 

InstallShield X制作安装程序杂记(3.Orgnization节点)

()Setup Design 安装设计,这个节点实际是FeaturesComponents的一个树结构
(
)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,上一篇中已经说明了ComponentFeature的关系。所以这里,特别要注意的是,要看清楚最上面的那一行字“Add new components to the feature”后面的下拉框,(2)中的文件,将和指定的Feature相关联,如果这里指定得不对,假如用户没有选定这个Feature,那这些文件就不会安装到指定的目录。
2.Redistributables
直译是重新分配表,我理解的就是安装所需要的一些附带包,可以翻译为分发包点击就可以看到一个列表,把需要的包打勾就可以。

 

InstallShield X制作安装程序杂记(5.System Configuration节点)

1.Shortcuts(快捷方式)快捷方式主要是以下几个地方:
Start Menu(
开始菜单)/Programs Menu(程序菜单)/Startup(启动)/Desktop(桌面)
   
1Start Menu,如果你装了UtraEdit就知道了,点击开始菜单,在上方就可以看到,这是比较cool的一种方式,堪称最快捷。而且很多软件都不往那里装,比较显眼,好找。
   
2Programs Menu,是大多数软件都采用的快捷方式位置,即在开始->程序中所列出。
   
3Startup,如果你的软件希望用户开机就运行,可以在这里建立,位于开始->程序->启动。
   
4Desktop,在桌面创建快捷方式。
   
几种快捷方式的配置方式都一样,在相应节点上点击右键,有一个New Shortcut(但我这里不知道什么原因该项无效),我使用的是New Advertised Shortcut,建立以后,右边会出现一个Key-Value表项,这里挑几个说说。
        Display Name
:快捷方式的名称。
        Target
:这里写快捷方式指向的文件名,对应快捷方式中的目标。比如\bin\pmain.exe
        Arguments
:参数。比如主程序的运行参数是pmain  -start,那这里就填写-start

        Working Directory
:对应快捷方式中的起始位置比较重要,如果不设置,而程序中使用GetCurrentPath可能获得的是快捷方式所在的位置(如桌面,而不是目标所在目录),从而导致程序路径错误。对应上面的Target,这里应该填写    \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 ResourcesODBC 源)
4.INI File Changesini文件更改)
5.Environment Variables(环境变量)
这几个节点的配置很简单,我就不说了。

 

InstallShield X制作安装程序杂记(6.Server Configuration节点)

1.Internet Information ServicesIIS配置):主要是给Web项目制作使用的。
        
这里有一个根IIS Configuration,右键->Add web side(建立web站点),建立站点时候,可以在站点上面建立虚拟目录(New Virtual Directory)。右边的Key-Value表中有很多条目,只要你会设置IIS,这些都是小菜了。
2.SQL ServersMS 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”运行程序等等,这是怎么做到的呢?
关键词:OnMovedSdFinish
     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帮助中有说明,但有一些环节弄不好就无法实验成功。比如ControlIDDialogID等。
通过自己的摸索,我完成了自定义对话框的建立、事件编写已经调用,现整理出来,希望能给大家提供帮助。
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,设置fbysssDialogISResourceID10333(如果有重复就改变数字)
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

 

阅读(6692) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-08-24 09:41:31

show my appreciation to you, THX.