InstallScript是专门用来编写InstallShield安装程序的脚本语言。由于InstallScriptC语言极为相似,因而使得Visual C++用户编写安装脚本程序颇为得心应手。即使对于没有任何语言基础的用户来说,编写InstallScript程序也不会觉得无从下手,因为InstallScript程序结构是非常简单的。并且,
InstallScript为用户提供了超过250个的内部函数,从而使得用户不需要太多的代码就能编写出具有专业水准的安装程序来。

  2.1 InstallScript程序结构

  同其他程序设计语言一样,InstallScript脚本语言也有自己的程序结构。

  2.1.1 几个InstallScript程序

  下面先来看看几个比较简单的InstallScript程序。

  [Ex_Hello] 一个简单的InstallScript程序,用来弹出"问候"对话框。
   STRING szTitle;
program
szTitle = "问候";
SetDialogTitle (DLG_MSG_INFORMATION, szTitle);
MessageBox("您好!", INFORMATION );
endprogram

  程序中,dprogram构成主程序体,每一个InstallScript程序中都必须包含一个且只有一个这样的主程序体。在主程序体外,只能是变量定义、用户函数定义以及预处理指令等,而程序体内可以包括若干条语句,每一条语句都由分号""结束。本例中,SetDialogTitleMessageBox都是InstallScript的内部函数,它们分别用来设置对话框的标题和显示指定的信息文本,INFORMATION是一个系统预定义的常量,szTitle变量是在程序体外定义的字符串变量。

  [Ex_Func] 自已定义一个函数,用来显示消息对话框。
   STRING szTitle; // 定义一个字符串变量
prototype MyMessage(STRING, STRING); // 自定义函数的声明
    program
szTitle = "问候";
MyMessage(szTitle, "您好!");
endprogram
   function MyMessage(szTitle, szMessage) /* MyMessage函数体 */
begin
SetDialogTitle (DLG_MSG_INFORMATION, szTitle);
MessageBox(szMessage, INFORMATION );
end;
尽管本例的结果和Ex_Hello示例相同,但它使用了自定义函数MyMessageInstallScript语言规定,一个自定义函数名必须在program关键字前面声明,而函数体代码的实现代码必须在endprogram后进行,且每个自定义的函数体都必须以begin开始end结束(注意end后要有
分号"")。程序中的"/*...*/"之间的内容或"//"开始一直到行尾的内容是用来注释的,它的目的只是为了提高程序的可读性,对编译和运行并不起作用。正是因为这一点,注释的内容可以用汉字来表示,也可以用英文来说明,只要便于理解就行。

  [Ex_Include] 使用包含文件。
   #include "Sddialog.h";
   STRING szTitle, szMsg, svDir;
    program
     szTitle = "SdAskDestPath Example";
svDir = "C:\\EXAMPLE\\TARGET";
szMsg = "";
    // 获取用户指定的安装路径
if (SdAskDestPath(szTitle, szMsg, svDir, 0) = NEXT) then
TARGETDIR = svDir;
endif;
    // 显示用户指定的安装路径
SprintfBox(INFORMATION, "SdAskDestPath", "Successful.\n\nThe Target " +
"directory is: " + TARGETDIR);
    endprogram
#include "Sddialog.rul"

  该程序是使用Sd(Script Dialog,脚本对话框)对话框函数的一个示例。InstallScript语言规定,在调用Sd对话框函数时,需要在program前加上#include "Sddialog.h"语句,而在endprogram后加#include "Sddialog.rul"。与C语言相似,#include "Sddialog.h"#include "Sddialog.rul"InstallScript的编译指令,称为预处理指令。InstallScript编译系统会根据预处理指令#include中的文件名,把该文件的内容包含进来。也就是说,实际程序的代码长度是在原来长度的基础上增加了Sddialog.hSddialog.rul文件的长度。程序中,SprintfBox参数内容中的"\n"是换行符,即在"Successful."文本后回车换行。
2.1.2 InstallScript程序的基本组成

  从上面的几个示例可以看出,一个InstallScript程序往往由预处理命令、函数、语句、变量以及注释等几个基本部分组成的。

  (1) 预处理命令

  在InstallScript程序的一开始经常出现含有以"#"开头的命令,它们是预处理命令。InstallScript提供了三类预处理命令:宏定义命令、文件包含命令和条件编译命令。

  (2) 函数

  一个InstallScript程序是由若干个函数组成的。这些函数中,有的是InstallScript系统中所提供的内部函数,有的是用户根据自己需要自己编制设计的函数(如例Ex_Func中的MyMessage)

  (3) 语句


  语句是组成程序的基本单元,它可以是用来判断的条件语句,也可以是用来反复运行的循环语句等。这些语句是组成InstallScript程序中的最重要部分之一。

  (4) 变量

  大多数程序离不开变量。InstallScript变量的类型比较简单,主要有数值型(NUMBER)、字符串型(STRING)以及链表型(LIST)等,例如例Ex_Hello中的szTitle是一个STRING型变量。

  (5) 注释

  程序的目的不仅在于实现某种功能、解决某个问题,而且还在于数据结构和算法的交流。因此在程序中添加必要的注释是非常重要的,它能提高程序的可读性,帮助用户对程序的理解。

  需要说明的是,InstallScript不支持控制台的输入和输出,数据的输入和输出是通过对话框进行的。
2.1.3 InstallScript程序的书写风格

  尽管InstallScript语言比CC++语言容易理解,但对于初学者来说,一开始就养成良好的编程习惯仍然是非常重要和必要的。

  1. 标识符命名

  标识符是用来标识变量名、函数名、结构名、文件名等的有效字符序列。标识符命名的好坏直接影响程序的可读性,例如a1b1c1d虽然是合法的标识符,但却是不好的标识符,因为它不能让人理解它们所代表的含义。下面几个原则是命名时所必须注意的:

  (1) 合法性

  InstallScript规定标识符由大小写字母、数字字符(0―9)和下划线组成,且第一个字符必须为字母或下划线。任何标识符中都不能有空格、标点符号及其他字符,例如下面的标识符是不合法的:

   93SalaryYouhe.Ding$178#5f68r<D
注意,InstallScript中标识符的大小写是有区别的。例如,dataDataDaTaDATA等都是不同的标识符。
用户定义的标识符不能和系统的关键字同名。以下是43InstallScript关键字:

    abort begin BOOL BYREF
    case CHAR default downto
    else end elseif endfor
    endif endprogram endswitch endwhile
    exit for function GDI
    goto HWND if INT
    KERNEL LIST LONG NUMBER
    POINTER program prototype repeat
    return SHORT step STRING
    switch then to typedef
    until USER while

  需要注意的是,用户定义的标识符还不能和InstallShield的函数名、系统变量名以及预定义的常量名相同。

  (2) 有效性

虽然,标识符的长度(组成标识符的字符个数)是任意的,但最好不能超过32个,因为InstallShield的编译系统只能识别前32个字符,也就是说前32个字符相同的两个不同标识符被有的系统认为是同一个标识符。
8


  (3) 字符串函数title作用易读性

  在定义标识符时,若能做到"见名知意"就可以达到易读性的目的。为了达到这个目的,许多Visual BasicVisual C++Delphi等程序员广泛使用匈牙利的命名规则来定义标识符,InstallScript也使用这个<
命名规则。

  匈牙利的命名规则是将标识符的类型(小写)来作为标识符的前缀。例如前面的szTitle表示一个字符串变量,其中的sz表示STRING变量类型。表2.1列出了常用变量的前缀。除此之外,对于函数名的命名往往使用多个单词来组成,每个单词的第一字母都是大写,例如前面的SdAskDestPath函数名。 



  2. 缩进和注释

  缩进是指程序在书写时不要将程序的每一行都由第一列开始,而且在适当的地方加进一些空行或空格。它同注释一样,也是为了提高程序的可读性。

  注释的重要性已在前面论及过,这里不再重复。但要注意的是:

  (1) 注释应在编程的过程中同时进行,不要指望程序开发完成后再补写注释。那样只会多花好几倍的时间,更为严重的是,时间长了以后甚至会读不懂自己写的程序。 必要的注释内容应包含:脚本程序的总体注释(文件名、作用、创建时间、版本、作者及引用的手册、运行环境等)、函数注释(目的、算法、使用的参数和返回值的含义、对环境的一些假设等)及其他的少量注释。千万不要陈述那些一目了然的内容,否则会使注释的效果适得其反』些空行或空格。它同注释一样,也是为了提高程序的可读性。

  注释的重要性已在前面论及过,这里不再重复。但要注意的是:


  (1) 注释应在编程的过程中同时进行,不要指望程序开发完成后再补写注释。那样只会多花好几倍的时间,更为严重的是,时间长了以后甚至会读不懂自己写的程序。 必要的注释内容应包含:脚本程序的总体注释(文件名、作用、创建时间、版本、作者及引用的手册、运行环境等)、函数注释(目的、算法、使用的参数和返回值的含义、对环境的一些假设等)及其他的少量注释。千万不要陈述那些一目了然的内容,否则会使注释的效果适得其反。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。