InstallShield学习笔记开发语言.docx
《InstallShield学习笔记开发语言.docx》由会员分享,可在线阅读,更多相关《InstallShield学习笔记开发语言.docx(30页珍藏版)》请在冰豆网上搜索。
InstallShield学习笔记开发语言
InstallShield学习笔记
ScriptLanguage
RevisionHistory
DATE
REVISION
AUTHOR
DESCRIPTION
TableofContents
1前言3
2数据类型和结构体3
2.1基本数据类型3
2.2多元素数据类型3
2.2.1数组(Array)3
2.2.2列表(List)4
2.3数据结构4
2.3.1声明数据结构4
2.3.2存取数据结构4
3变量与常量5
3.1变量的定义及赋值5
3.2常量的定义及赋值5
3.3匈牙利命名法5
4操作符与表达式6
4.1逻辑操作符6
4.2逻辑操作符6
4.3关系操作符7
4.4字符串操作符7
4.5地址相关操作符8
5代码块8
5.1条件语句8
5.1.1if-then-endif结构8
5.1.2if-then-else-endif结构8
5.1.3if-elseif-endif结构8
5.1.4if-goto结构9
5.1.5嵌套if-else-endif结构9
5.1.6switch…endswitch结构9
5.2循环语句10
5.2.1for…endfor结构10
5.2.2while…endwhile结构10
5.2.3repeat…until结构10
5.3跳转语句11
5.4中止及退出语句11
6函数11
6.1函数声明定义11
6.2函数参数传递12
6.3函数调用12
6.4函数返回12
7错误处理13
7.1捕获错误13
7.2函数错误13
8预处理语句14
9代码注释14
9.1单行注释14
9.2多行注释15
10使用内置变量及函数15
10.1预定义常量15
10.2预定义脚本变量15
10.3系统变量15
10.4内置函数15
1前言
InstallScript是专门用来编写InstallShield安装程序的脚本语言。
它语法类似C语言,是一种过程化的语言。
除了内置的几百个常用函数(Function)之外,用户可以通过这种script自己编写脚本,实现各种复杂需求,
从而设计出灵活且强大的安装程序。
本文档是笔者在学习InstallShield脚本的过程中,查阅InstallShield2009IDE的联机帮助,结合个人学习心得体会,写出的学习笔记。
。
鉴于篇幅有限,本文仅就InstallShieldScript各方面的基本用法做了一些总结,仅供新手入门作参考之用。
若读者有意深入研究高级进阶内容,请参考InstallScriptIDE(集成开发环境)自带的联机帮助,
或者在网上搜寻参考资料(附:
InstallShield社区论坛:
2数据类型和结构体
2.1基本数据类型
跟其它的高级语言一样,InstallShieldScript也支持常见的基本数据类型,列举如下:
类型
数值
注释
BOOL
布尔型
其值可以是TRUE或FALSE,或者1或0
char或
CHAR
字符型
其值可以是一个单字节的符号(比如“a”,“A”),
或一个代表符号的ASCII数字值(比如127)
string或
STRING
字符串型,比如”stringtext”
字符串是一个包含若干字符(双字节)的数组
Int或INT
双字节整数型
一般使用上,等同于NUMBER类型
short或SHORT
短整数型
一般使用上,等同于NUMBER类型
Long或LONG
长整数型
一般使用上,等同于NUMBER类型
number或
NUMBER
数值型
带正负符号的四字节整数,其值范围在
-2,147,483,648和+2,147,483,647之间
pointer或
POINTER
指针型
跟C语言中的指针类似,也是一种对变量的内存地址的引用,通常在变量名前使用取址符号&获得对其地址的引用
VARIANT
变量类型
可用于数组
HWND
窗口句柄型
对窗口对象的引用,通常用CmdGetHwndDlgorGetWindowHandle函数来初始化
注:
上表中没有列出一些极少使用的类型(比如LPSTR,VARIANT,VOID,WSTRING等)。
若要获得相关信息,请参考InstallShieldIDE的联机帮助。
2.2多元素数据类型
数组(Array)和列表(List)是包含多元素的复杂数据类型,在此节单独介绍。
2.2.1数组(Array)
InstallShieldScript中的数组如同其它高级语言里面的数组一样,也是一个无序的同类型的元素集合,
用户通过数组名加上方括号和下标数字进行存取元素的值,如下例子所示:
2.2.2列表(List)
InstallShieldScript中的列表是一种有序元素的集合体,比数组复杂得多。
列表中的元素除了可以象数组那样使用元素下标获取之外,也可以通过其它元素的位置向前或者向后追溯而得到。
InstallShieldScript提供了很多对列表进行操作的方法,详见InstallShieldIDE的联机帮助,这里仅介绍几种常用的方法:
2.3数据结构
在某些特殊场合,需要将一些基本数据类型的变量组合成一个复合的数据结构。
2.3.1声明数据结构
//以下片断声明一个名为STAFF的数据结构类型,
//它由两个STRING元素和一个NUMBER元素组成
typedefSTAFF
begin
STRINGszName(20);
STRINGszTitle(10];
NUMBERnAge;
end;
声明数据结构时的注意事项:
1.数据结构不能在函数体(functionbody)内部声明。
2.数据结构中的某元素如果是STRING类型,必须加上数组长度,比如此例子中的STRINGszName(20)。
3.数据结构体中不能使用BYREF关键字,也不要使用POINTER类型元素。
2.3.2存取数据结构
数据结构中的元素,通过点号进行引用,如下所示:
//以下片断创建一个STAFF的数据结构,并给其元素赋值
STAFFstructSTAFF;
structSTAFF.szName=“TomXu”;
structSTAFF.szTitle=“Engineer”;
structSTAFF.nAge=30;
//以下片断读取此数据结构中的元素值到三个STRING类型的变量中
STRINGszData1,szData2,szData3;
szData1=structSTAFF.szName;
szData2=structSTAFF.szTitle;
szData2=structSTAFF.nAge;
存取数据结构时的注意事项:
1.两个数据结构类型的变量之间不能直接互相赋值(用=操作符赋值)。
3变量与常量
3.1
d
变量的定义及赋值
在InstallShieldScript中,根据作用范围,变量分为两种类型:
●局部变量-定义在函数变量区的变量(位置在function关键字和begin关键字之间),
它们只能在该函数体内部被赋值或读取。
●全局变量-定义主程序块(mainprogramblock)之外且不在函数内部的变量(位置一般在script文件的头部分),它们在该setupscript文件的全局范围内(该变量定义之后的任何地方)都可以被赋值或读取。
//以下片断示范了全局变量和局部变量的定义,以及它们的可见范围
STRINGszGlobal;//声明一个全局变量
prototypeDisplayMsg(STRING);//声明函数原型
functionDisplayMsg(szMsg)//为前面的方法原型定义函数体
begin
STRINGszLocal;//声明一个局部变量,注意它是定义在函数体内部
szLocal=“IamaLocalvariable”;//给前面这个局部变量赋值
szGlobal=“IamaGlobalvariable”;//给函数体外部定义的那个全局变量赋值
end;
3.2常量的定义及赋值
在InstallShieldScript中,常量的使用跟其它高级语言中的常量相同,常量名为大写字母.
且其值在定义时被初始化后,不能被再次赋值。
注意:
常量的定义必须在前面使用#define关键字,紧跟常量名和常量值,用空格隔开,
切记不可用等于号赋值,并且句尾不可带分号,如下面的例子所示
//以下片断示范了常量的定义以及使用
#defineTITLE"Welcome"//定义并初始化了一个名为TITLE的字符串型常量
#defineVERSION670//定义并初始化了一个名为VERSION的数值型常量
STRINGszResult;
szResult=TITLE;//正确用法:
引用TITLE常量的值
TITLE=“UpdatedWelcome”;//错误用法:
给TITLE常量再次赋值,编译时会报错
3.3匈牙利命名法
在InstallShieldScript中,对变量(和函数参数),常量的命名一般使用”匈牙利命名法”,即在名字前面加上两位小写字母的前缀(prefix),用来表明该变量的数据类型,比如名为nResult的变量表示其值是NUMBER型,名为szName的变量表示其值是STRING型。
另外,在函数体(functionbody)定义中,对函数参数名也应用这种命名法,可以让函数调用者明白该传入什么类型的参数值。
比如,我们定义了一个函数functionMyFunction(szName,nOption),
那么其它人马上明白:
调用该函数时应该传入两个参数值,第一个为STRING型,第二个为NUMBER型。
下表中列出了“匈牙利命名法“中常用的前缀,我们在实际使用中应该尽量遵循这些规则:
前缀
表示数据类型
变量命名例子
使用范围
b
布尔型(BOOL)
bResult
用于布尔型的变量(variable)或常量(constant)
bv
布尔型(BOOL)
bvOK
只用于布尔型的函数参数,该参数在函数内部会被赋值
c
字符型(CHAR)
cInput
用于字符型的变量(variable)或常量(constant)
const
常量
constPrefix
只用于常量(constant)
h
窗口句柄型(HWND)
hWindow
只用于窗口句柄型的变量(variable)
i
整数型(INT)
iLevel
用于整数型的变量(variable)或常量(constant)
l
长整数型(LONG)
lAmount
用于长整数型的变量(variable)或常量(constant)
lv
长整数型(LONG)
lvCount
只用于长整数型的函数参数,该参数在函数内部会被赋值
list
列表类型(LIST)
listIChoices
只用于列表类型的变量(variable)
n
数值型(NUMBER)
nValue
用于数值型的变量(variable)或常量(constant)
nv
数值型(NUMBER)
nTmpValue
只用于数值型的函数参数,该参数在函数内部会被赋值
p
指针型(POINTER)
pVarAddress
只用于指针型的变量(variable)
pstruct
指针型(POINTER)
pstructDataStruct
只用于指向数据结构(datastructure)的指针型的变量(variable)
s
短整数型(SHORT)
sOption
用于短整数型的变量(variable)或常量(constant)
sz
字符串型(STRING)
szName
用于字符串型的变量(variable)或常量(constant)
sv
字符串型(STRING)
svTmpName
只用于字符串型的函数参数,该参数在函数内部会被赋值
struct
数据结构型(自定义)
structMyStruct
只用自定义的数据结构型(datastructure)的变量(variable)
注:
1.在InstallShieldScript中,请注意标志符号(包含变量名等)是大小写敏感的(e.g.szName!
=szNAME).
2.在上表中提到的bv,lv,nv,sv等前缀都是代表对应数据型的一种可变变量,一般由调用主程序传递给函数,
在函数体内被赋值。
比如常见的读取注册表z键值的函数,后面三个参数都会在函数体内被赋值,如下:
RegDBGetKeyValueEx(szKey,szName,nvType,svValue,nvSize);
4操作符与表达式
以下板块列出了InstallShieldScript中常用的各种类型的操作符号及相关表达式。
对某些甚少使用的操作符若有未尽之处,请查阅InstallShieldIDE的联机帮助
4.1逻辑操作符
符号
含义
表达式例子
表达式解释
+
加法
3+2(=5)
两个数字值相加
-
减法
3-2(=1)
两个数字值相减
*
乘法
3*2(=6)
两个数字值相乘
/
除法
3/2(=1.5)
两个数字值相除
%
取模
5%2(=1)
两个数字值取模
4.2逻辑操作符
符号
含义
表达式例子
表达式解释
&&
AND
expression1&&expression2
两逻辑值执行与操作。
只有当表达式expression1和expression2都为TRUE时,返回TRUE;否则返回FALSE.
||
OR
expression1||expression
两逻辑值执行或操作。
当表达式expression1或者expression2任一为真时,返回TRUE;只有当两者都为FALSE时才返回FALSE
!
NOT
!
expression1
逻辑值取反。
当表达式expression1为FALSE时返回TRUE;
反之则返回FALSE。
4.3关系操作符
符号
含义
表达式例子
表达式解释
=
等于
nValue1=nValue2
当nValue1与nValue2相等时,返回TURE;
否则返回FALSE。
>
大于
nValue1>nValue2
当nValue1大于nValue2时,返回TURE;
否则返回FALSE。
<
小于
nValue1当nValue1小于nValue2时,返回TURE;
否则返回FALSE。
>=
大于或等于
nValue1>=nValue2
当nValue1大于或者等于nValue2时,返回TURE;
否则返回FALSE。
<=
小于或等于
nValue1<=nValue2
当nValue1小于或者等于nValue2时,返回TURE;
否则返回FALSE。
!
=
不等于
nValue1!
=nValue2
当nValue1不等于nValue2时,返回TURE;
否则返回FALSE。
4.4字符串操作符
符号
含义
表达式例子
表达式解释
+
字串相加
szStr1+szStr2
例如:
szStr1=“Gordon”;
szStr2=“Chen”;
那么此表达式返回值将是:
szStr1+szStr2=“GordonChen”;
^
拼结路径
szFilePath^szFileName
假如:
szFilePath="C:
\\MyPath";
szFileName="test.txt";
那么此表达式返回值将是:
szFilePath^szFileName=“C:
\MyPath\test.txt”;
%
字串查找
szSource%szTarget
如果szSource字符串包含szTarget字符串,则返回TRUE;否则返回FALSE。
假如:
szSource="IamGordonChen";
szTarget="Gordon";
那么此表达式返回值将是TRUE:
szSource%szTarget=TRUE;
@
字串引用
@szConstantName
引用InstallShieldproject的StringTable中定义的常量
(注:
在IDE中进入StringTable路径如下:
InstallationInformation->GeneralInformation->
StringTable)。
例如:
如果StringTable中有定义一个名为IDS_PROT,
值为”Accela”的条目。
那么在script中使用@IDS_PROT表达式:
得到的值将会是”Accela”这个字符串。
4.5地址相关操作符
符号
含义
表达式例子
表达式解释
&
由变量取地址
pPointer=&szValue
&和*是一对互逆的操作符。
&用来取一个变量的地址值,返回指针(pointer)类型值;
而*用来取一个指针指向的变量值,返回该变量的类型。
例如:
POINTERpPointer;
STRINGszValue,szResult;
szValue=“GordonChen”;
pPointer=&szValue;//取变量szValue的地址
szResult=*pPointer;//取指针pPointer指向的变量
*
由地址取变量
SzValue=*pPointer;
5代码块
5.1条件语句
5.1.1if-then-endif结构
这种结构只包含一个if分支。
首先判断if中表达式的返回值,如果为TRUE则执行then关键字后面的代码块,否则直接跳过该代码块。
//以下片断示范了标准的if-then-endif代码块结构
NUMBERnAnswer;
nAnswer=AskYesNo("Areyousureyouwanttoexit?
",NO);
if(nAnswer=YES)then
MessageBox("Youchoosetoexit!
",WARNING);
endif;
5.1.2if-then-else-endif结构
这种结构包含一个if和一个else分支。
首先判断if中表达式的返回值,如果为TRUE则执行then关键字后面的代码块,否则就执行else关键字后面的代码块。
//以下片断示范了标准的if-then-else-endif代码块结构
NUMBERnAnswer;
nAnswer=AskYesNo("Areyousureyouwanttoexit?
",NO);
if(nAnswer=YES)then
MessageBox("Youchosetoexit!
",WARNING);
else
MessageBox("Yougaveuptoexit!
",WARNING);
endif;
5.1.3if-elseif-endif结构
这种结构包含一个if和若干个elseif分支,注意没有else分支。
首先判断if中表达式的返回值,如果为TRUE则接着执行其后then关键字后面的代码块。
否则就依次逐一匹配后面的每个elseif关键字后面的表达式,如果发现其值为TRUE就会执行它对应的then关键字后面的代码块。
//以下片断示范了标准的if-elseif-endif代码块结构
NUMBERnAnswer;
nAnswer=AskYesNo("Areyousureyouwanttoexit?
",NO);
if(nAnswer=YES)then
MessageBox("Youchosetoexit!
",WARNING);
elseif(nAnswer=YES)then
MessageBox("Yougaveuptoexit!
",WARNING);
elseif(nAnswer=9999)then
MessageBox("Areyoujoking?
Itisimpossible!
",WARNING);
endif;
5.1.4if-goto结构
这种结构包含一个if分支,它在逻辑执行上类似于前面介绍的if-then-endif结构,所不同的是此处使用goto关键字跳转到一个标号(label)的定义处去执行代码。
另外,这种用法必须要求条件表达式后面紧跟goto声明(if和goto写在一行),另外它也不能使用else和endif关键字。
//以下片断示范了标准的if-goto代码块结构
NUMBERnAnswer;
nAnswer=AskYesNo("Areyousureyouwanttoexit?
",NO);
if(nAnswer=YES)gotoAction_YES;//如果条件为TRUE,则跳转到标号处开始执行
/*这里有一些其它代码,但是它们将会被直接跳过*/
Action_YES:
MessageBox("Youchosetoexit!
",WARNING);
5.1.5嵌套if-else-endif结构
这种嵌套结构基于普通的的if-then-endif结构而来,在if代码块或者else代码块中都可以分别嵌入另外的
if-then-endif代码结构。
可以在if和else两者中同时加入嵌套,也可以只在两者之一中加入嵌套,如下例:
NUMBERnAnswer;
if(szType=“Staff”)then
if(szTitle=“Manager”)then//此处为第一级if里面嵌套的if-else-endif结构
MessageBox("Welcome,Youhavefullaccess!
"