InstallShield学习笔记开发语言Word格式.docx
- 文档编号:20589168
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:30
- 大小:140.08KB
InstallShield学习笔记开发语言Word格式.docx
《InstallShield学习笔记开发语言Word格式.docx》由会员分享,可在线阅读,更多相关《InstallShield学习笔记开发语言Word格式.docx(30页珍藏版)》请在冰豆网上搜索。
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
短整数型
Long或LONG
长整数型
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)//为前面的方法原型定义函数体
STRINGszLocal;
//声明一个局部变量,注意它是定义在函数体内部
szLocal=“IamaLocalvariable”;
//给前面这个局部变量赋值
szGlobal=“IamaGlobalvariable”;
//给函数体外部定义的那个全局变量赋值
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
bvOK
只用于布尔型的函数参数,该参数在函数内部会被赋值
c
字符型(CHAR)
cInput
用于字符型的变量(variable)或常量(constant)
const
常量
constPrefix
只用于常量(constant)
h
窗口句柄型(HWND)
hWindow
只用于窗口句柄型的变量(variable)
i
整数型(INT)
iLevel
用于整数型的变量(variable)或常量(constant)
l
长整数型(LONG)
lAmount
用于长整数型的变量(variable)或常量(constant)
lv
lvCount
只用于长整数型的函数参数,该参数在函数内部会被赋值
list
列表类型(LIST)
listIChoices
只用于列表类型的变量(variable)
n
数值型(NUMBER)
nValue
用于数值型的变量(variable)或常量(constant)
nv
nTmpValue
只用于数值型的函数参数,该参数在函数内部会被赋值
p
指针型(POINTER)
pVarAddress
只用于指针型的变量(variable)
pstruct
pstructDataStruct
只用于指向数据结构(datastructure)的指针型的变量(variable)
s
短整数型(SHORT)
sOption
用于短整数型的变量(variable)或常量(constant)
sz
字符串型(STRING)
szName
用于字符串型的变量(variable)或常量(constant)
sv
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;
<
小于
nValue1<
当nValue1小于nValue2时,返回TURE;
=
大于或等于
=nValue2
当nValue1大于或者等于nValue2时,返回TURE;
小于或等于
当nValue1小于或者等于nValue2时,返回TURE;
不等于
nValue1!
当nValue1不等于nValue2时,返回TURE;
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;
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”;
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代码块结构
MessageBox("
Youchosetoexit!
else
Yougaveuptoexit!
5.1.3if-elseif-endif结构
这种结构包含一个if和若干个elseif分支,注意没有else分支。
首先判断if中表达式的返回值,如果为TRUE则接着执行其后then关键字后面的代码块。
否则就依次逐一匹配后面的每个elseif关键字后面的表达式,如果发现其值为TRUE就会执行它对应的then关键字后面的代码块。
//以下片断示范了标准的if-elseif-endif代码块结构
elseif(nAnswer=YES)then
elseif(nAnswer=9999)then
Areyoujoking?
Itisimpossible!
5.1.4if-goto结构
这种结构包含一个if分支,它在逻辑执行上类似于前面介绍的if-then-endif结构,所不同的是此处使用goto关键字跳转到一个标号(label)的定义处去执行代码。
另外,这种用法必须要求条件表达式后面紧跟goto声明(if和goto写在一行),另外它也不能使用else和endif关键字。
//以下片断示范了标准的if-goto代码块结构
if(nAnswer=YES)gotoAction_YES;
//如果条件为TRUE,则跳转到标号处开始执行
/*这里有一些其它代码,但是它们将会被直接跳过*/
Action_YES:
5.1.5嵌套if-else-endif结构
这种嵌套结构基于普通的的if-then-endif结构而来,在if代码块或者else代码块中都可以分别嵌入另外的
if-then-endif代码结构。
可以在if和else两者中同时加入嵌套,也可以只在两者之一中加入嵌套,如下例:
if(szType=“Staff”)then
if(szTitle=“Manager”)then//此处为第一级if里面嵌套的if-else-endif结构
Welcome,Youhavefullaccess!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- InstallShield 学习 笔记 开发 语言