InstallShield学习笔记开发语言.docx

上传人:b****6 文档编号:7980812 上传时间:2023-01-27 格式:DOCX 页数:30 大小:140.21KB
下载 相关 举报
InstallShield学习笔记开发语言.docx_第1页
第1页 / 共30页
InstallShield学习笔记开发语言.docx_第2页
第2页 / 共30页
InstallShield学习笔记开发语言.docx_第3页
第3页 / 共30页
InstallShield学习笔记开发语言.docx_第4页
第4页 / 共30页
InstallShield学习笔记开发语言.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

InstallShield学习笔记开发语言.docx

《InstallShield学习笔记开发语言.docx》由会员分享,可在线阅读,更多相关《InstallShield学习笔记开发语言.docx(30页珍藏版)》请在冰豆网上搜索。

InstallShield学习笔记开发语言.docx

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!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1