InstallScript 是一种基于 C 语言的脚本语言,因此它的函数参数传递方式和 C 语言非常相似,但也有其独特之处,尤其是在处理字符串、句柄和自定义类型时。

理解 InstallShield 函数参数主要需要掌握以下几点:
- 参数的数据类型
- 参数的传递方式(值传递 vs. 引用传递)
- 常见类型的特殊处理
- 如何查找函数定义和参数说明
InstallScript 的主要数据类型
在讨论参数之前,必须先了解 InstallScript 支持哪些数据类型,因为参数的类型决定了它的使用方式。
| 数据类型 | 描述 | 示例 |
|---|---|---|
NUMBER |
整数,范围是 -2,147,483,648 到 2,147,483,647 | 123, -456 |
STRING |
字符串,最大长度为 1024 个字符(在旧版本中)或更多(取决于版本和编译设置) | "Hello World", "C:\\Program Files" |
LIST |
列表,可以包含多个字符串元素 | ListCreate("Item1", "Item2") |
HWND |
窗口句柄,用于标识一个窗口或控件 | HWND_DESKTOP (桌面窗口) |
HWNDPANE |
面板句柄,用于在向导界面中引用特定的面板 | WELCOME_PANE |
EVENT |
事件句柄,用于处理用户交互事件 | EVENT_BUTTON_CLICKED |
RECORD |
记录类型,通常用于数据库操作或自定义数据结构 | SdGetProductInfo() 返回一个记录 |
OBJECT |
对象句柄,例如文件、文件夹、注册表项等 | OpenFileMode(FILE_MODE_APPEND) |
BOOL |
布尔值,虽然不是基本类型,但常用 1 (真) 和 0 (假) 表示 |
1, 0 |
参数的传递方式:值传递 vs. 引用传递
这是理解参数行为的关键。
值传递
这是最常见的传递方式,函数接收到的是参数值的一个副本,在函数内部对参数的任何修改都不会影响到函数外部的原始变量。

-
适用于类型:
NUMBER,STRING(在大多数情况下),LIST。 -
示例:
// 定义一个函数,它接收一个 NUMBER 类型的参数,并尝试修改它 function ModifyValueByValue(NUMBER nValue) begin nValue = nValue + 100; // 修改的是副本,不影响外部变量 SprintfBox(INFORMATION, "函数内部", "修改后的值为: %d", nValue); end; // 主程序 NUMBER nMyNumber = 50; SprintfBox(INFORMATION, "调用前", "原始值为: %d", nMyNumber); ModifyValueByValue(nMyNumber); SprintfBox(INFORMATION, "调用后", "值依然是: %d", nMyNumber); // 输出依然是 50
引用传递
函数接收到的是参数的内存地址,在函数内部对参数的修改会直接影响函数外部的原始变量,在 InstallScript 中,这通常通过传递一个变量的指针来实现。
-
适用于类型:当函数需要返回多个值或修改外部变量时,一些函数(如字符串处理函数)会要求传递字符串的指针。
-
如何实现:在函数声明和调用时,在参数类型前加上
REF关键字。 -
示例:
// 定义一个函数,它接收一个 NUMBER 类型的引用参数,并修改它 function ModifyValueByRef(REF NUMBER rnValue) begin rnValue = rnValue + 100; // 修改的是原始变量 SprintfBox(INFORMATION, "函数内部", "修改后的值为: %d", rnValue); end; // 主程序 NUMBER nMyNumber = 50; SprintfBox(INFORMATION, "调用前", "原始值为: %d", nMyNumber); ModifyValueByRef(nMyNumber); // 调用时也使用变量名,不需要加 & 符号 SprintfBox(INFORMATION, "调用后", "值已被修改为: %d", nMyNumber); // 输出变为 150
常见类型的特殊处理
字符串
字符串是 InstallScript 中最常用的类型之一,其处理方式比较特殊。
-
作为值传递:当你传递一个字符串常量或字符串变量给一个只读取字符串的函数时(如
Sprintf),它是值传递,函数使用这个字符串,但不会改变原始变量。STRING szPath = "C:\\OldPath"; Sprintf(szPath, "C:\\NewPath"); // Sprintf 函数内部修改的是它自己的副本,szPath 仍然是 "C:\\OldPath"
-
作为引用传递:当你传递一个字符串变量的地址给一个需要修改字符串的函数时(如
SprintfBox或自定义函数),它是引用传递,函数会直接修改原始字符串变量。function MyStringFunction(REF STRING rszText) begin rszText = "This is a new string"; // 直接修改了调用者传入的变量 end; STRING szMyText = "Original"; MyStringFunction(szMyText); // 调用后,szMyText 的值变为 "This is a new string"
句柄
HWND, HWNDPANE, EVENT, RECORD 等类型通常不是直接传递值,而是传递一个句柄,句柄是一个唯一的标识符,代表内存中的一个对象(如窗口、面板、事件等),你不需要关心句柄的具体数值,只需在函数调用中传递它即可。
- 示例:
// Disable 函数需要一个 HWND (窗口句柄) 参数 Disable(BACKBUTTON); // 禁用向导中的“上一步”按钮,BACKBUTTON 是一个预定义的句柄常量
列表
列表是引用类型,当你将一个列表传递给函数时,你传递的是对列表内部数据的引用,而不是列表的副本,这意味着函数可以修改列表的内容(添加、删除元素),并且这些修改会反映在原始列表中。
-
示例:
function AddToList(LIST listRef) begin ListAddString(listRef, "New Item"); // 直接修改了传入的列表 end; LIST myList = ListCreate("A", "B"); AddToList(myList); // 调用后,myList 包含 "A", "B", "New Item"
如何查找函数定义和参数说明
这是实际编写脚本时最重要的技能。
使用 InstallShield 的帮助文档
这是最权威、最准确的来源,在 InstallShield IDE 中,通常可以通过以下方式访问:
- F1 键:将光标放在任何函数名上,然后按 F1,会直接跳转到该函数的帮助页面。
- 帮助菜单:通过
Help > InstallShield Help打开完整的帮助文档,然后使用索引查找函数。
帮助文档中通常包含以下信息:
- 函数语法:
FunctionName (parameter1, parameter2, ...) - 参数说明:详细列出每个参数的名称、类型和描述。
- 返回值:说明函数返回值的类型和含义。
- 示例代码:提供如何使用该函数的简单例子。
- 相关函数:列出功能相似的函数。
示例:Sprintf 函数的帮助文档
Sprintf
语法:
NUMBER Sprintf (STRING szResult, STRING szFormat, ...)描述: 将格式化的字符串写入一个字符串变量。
参数:
szResult- [输出]STRING类型的变量,用于存储格式化后的结果,这是一个引用参数。szFormat-STRING类型的变量,包含格式说明符(如%d,%s)。- - 可变数量的参数,与
szFormat中的格式说明符一一对应。返回值: 成功时返回
ISERR_SUCCESS(0),失败时返回错误码。示例:
STRING szMessage; NUMBER nAge = 30; Sprintf(szMessage, "Your age is: %d", nAge); // 执行后,szMessage 的值为 "Your age is: 30"
从这个例子可以看出,szResult 参数是输出参数,必须在函数外部预先定义一个字符串变量,并将其地址传递给 Sprintf,函数会将结果写入这个变量。
使用代码提示和自动补全
现代的 InstallShield IDE(如基于 Visual Studio 的版本)通常提供代码提示功能,当你输入一个函数名并输入左括号 时,IDE 会自动显示该函数的参数列表和类型提示,这对于快速回忆参数非常有帮助。
| 特性 | 描述 | 关键点 |
|---|---|---|
| 数据类型 | NUMBER, STRING, LIST, HWND, RECORD 等。 |
知道参数是什么类型才能正确使用它。 |
| 传递方式 | 值传递 (默认) 和 引用传递 (使用 REF 关键字)。 |
理解修改是否会影响到原始变量。 |
| 字符串处理 | 通常是引用传递,特别是作为输出参数时。 | 注意 Sprintf 的第一个参数是输出变量。 |
| 句柄传递 | 传递 HWND, HWNDPANE 等预定义的句柄常量。 |
不关心值,只关心它代表的对象。 |
| 查找信息 | 首选 F1 键和官方帮助文档。 | 这是编写可靠脚本的基石。 |
掌握这些要点,你就能更好地理解和使用 InstallShield 中成百上千个预定义的函数,从而高效地编写安装脚本。
