InstallShield脚本语言的编写
蒋燚
InstallShield脚 本 语 言 是 类 似 C语 言 , 利 用 InstallShield的 向 导 或 模 板 都 可 以 生 成 基 本 的 脚 本 程 序 框 架 , 可 以 在 此 基 础 上 按 自 己 的 意 愿 进 行 修 改 和 添 加 。
一 .基 本 语 法 规 则
1.变 量
BOOL 布 尔 型 值 为 TRUE(1)或 FALSE(0)
CHAR 字 符 型 一 字 节 长 的 (8bit)的 字 符
HWND 窗 口 句 柄 用 来 存 放 窗 口 句 柄
INT 整 型 两 字 节 长 的 整 数
LIST 列 表 型 指 向 InstallShield列 表 , 用 ListCreate和 ListDestroy
LONG 扩 展 数 值 型
LPSTR 扩 展 指 针
NUMBER 数 值 型 存 放 四 字 节 长 的 数 值 , 范 围 从 -2147483648到 +2147483647
POINTER 指 针 型
SHORT 短 数 值 型
STRING 字 符 串 型 十 分 类 似 VC中 的 LPCTSTR
变 量 如 同 标 准 的 C语 言 , 在 使 用 前 需 要 事 先 声 名 。 变 量 通 常 在 两 个 位 置 进 行 声 名 , 一 是 主 程 序 外 部 , 这 样 的 变 量 为 全 局 变 量 , 二 是 各 函 数 的 变 量 声 名 区 , 这 样 的 变 量 是 局 部 变 量 。
2.操 作 符
一 般 的 与 C语 言 相 同 操 作 符 , 在 这 里 不 做 详 解 , 以 下 主 要 介 绍 比 较 特 殊 的 操 作 符 ,
(1) + , - , * , /
以 上 四 个 操 作 符 与 C语 言 中 意 义 和 用 法 都 相 同 。
(2) &&
与 操 作 , 与 C语 言 中 用 法 相 同 , 例 : x1 && x2
(3) ||
或 操 作 , 与 C语 言 中 用 法 相 同 , 例 : x1 || x2
(4) !
非 操 作 , 与 C语 言 中 用 法 相 同 , 例 : !x1
(5) *
指 针 操 作 , 类 似 C语 言 中 的 *
(6) & , | , ^ , ~ , << , >>
分 别 为 位 与 , 位 或 , 按 位 异 或 , 按 位 取 反 , 左 移 和 右 移 , 其 意 义 和 用 法 都 与 C语 言 中 基 本 相 同 。
(7) .
该 操 作 符 用 于 结 构 , 用 来 得 到 结 构 的 子 项 , 与 Delphi的 . 用 法 类 似 , 例 如 :
typedef SETTINGSREC
begin
BOOL bSwitchOn;
STRING szMssg[255];
INT nVal;
end;
SETTINGSREC settings;
program
settings.bSwitchOn = FALSE;
settings.szMssg = "Off";
settings.nVal = 0;
(8) =
既 可 作 为 赋 值 号 , 同 时 也 做 等 于 符 , 例 如 :
str1 = "String";
if str1="String" then
endif;
(9) &
取 地 址 符 , 与 C语 言 用 法 类 似 。
(10) < , > , = , <= , >= , !=
分 别 表 示 小 于 , 大 于 , 等 于 , 小 于 等 于 , 大 于 等 于 , 不 等 于
(11) + , ^ , %
用 于 字 符 串 的 操 作 。
(12) ->
结 构 指 针 , 与 C语 言 中 用 法 类 似 。
(13) @
用 于 得 到 Resource窗 口 中 定 义 的 字 符 串 , 例 :
szReferenceFile = svDir ^ @PRODUCT_KEY;
3.函 数
InstallShield的 函 数 使 用 前 同 样 需 要 声 名 , 函 数 的 参 数 传 递 方 式 十 分 类 似 C语 言 , 例 如 下 面 的 函 数 声 名 :
prototype HandleMoveDataError( NUMBER );
该 声 名 中 函 数 名 为 HandleMoveDataError, 传 递 一 个 NUMBER类 型 的 参 数 。 调 用 该 函 数 时 也 基 本 与 C语 言 中 相 同 。
函 数 体 的 标 准 格 式 为 :
function functionname(nResult)
// 函 数 变 量 声 名 区
begin
// 程 序 区
end;
通 常 的 函 数 返 回 一 个 NUMBER型 的 数 。
4.主 程 序 结 构
主 程 序 以 program开 始 , 以 endprogram结 尾 ,
二 .框 架 程 序 的 基 本 结 构
程 序 开 始 为 函 数 与 变 量 的 声 明 区
通 过 向 导 建 立 的 框 架 程 序 包 含 以 下 一 些 主 函 数 :
prototype ShowDialogs();
// 显 示 安 装 向 导 对 话 框
prototype MoveFileData();
// 移 动 文 件 数 据
prototype HandleMoveDataError( NUMBER );
// 移 动 数 据 出 错 处 理
prototype ProcessBeforeDataMove();
// 移 动 文 件 数 据 前 的 处 理
prototype ProcessAfterDataMove();
// 移 动 文 件 数 据 后 的 处 理
prototype SetupRegistry();
// 安 装 注 册 , 用 户 可 在 此 加 入 一 些 代 码 , 通 常 用 于 对 注 册 表 的 操 作
prototype SetupFolders();
// 安 装 生 成 快 捷 方 式 , 通 常 用 户 可 在 此 加 入 生 成 快 捷 方 式 的 代 码
prototype CleanUpInstall();
// 安 装 完 成 后 清 除 临 时 文 件
prototype SetupInstall();
// 安 装 的 实 际 过 程
prototype SetupScreen();
// 设 置 安 装 过 程 的 屏 幕 显 示 ( 包 括 背 景 颜 色 , 字 体 等 )
prototype CheckRequirements();
// 检 查 安 装 需 求 ( 包 括 硬 盘 空 间 , 操 作 系 统 平 台 等 )
prototype DialogShowSdWelcome();
// 显 示 “ 欢 迎 ” 对 话 框 窗 口
prototype DialogShowSdLicense();
// 显 示 许 可 信 息 的 对 话 框
prototype DialogShowSdRegisterUserEx();
// 显 示 用 户 安 装 注 册 的 对 话 框
prototype DialogShowSdAskDestPath();
// 显 示 “ 安 装 路 径 选 择 ” 对 话 框
prototype DialogShowSdSetupType();
// 显 示 “ 安 装 类 型 选 择 ” 对 话 框
prototype DialogShowSdComponentDialog2();
// 当 用 户 选 择 “ 定 制 ” 安 装 时 , 用 于 显 示 供 用 户 选 择 的 组 件 的 对 话 框
prototype DialogShowSdSelectFolder();
// 显 示 快 捷 方 式 文 件 夹 选 择 的 对 话 框
prototype DialogShowSdFinishReboot();
// 显 示 “ 安 装 完 成 重 启 动 ” 对 话 框
编 程 实 例 :
1.怎 样 在 进 度 条 左 上 角 显 示 当 前 安 装 的 文 件
在 function SetupScreen()中 加 入 以 下 语 句
Enable( INDVFILESTATUS );
2.怎 样 改 变 窗 口 背 景 色
SetColor( BACKGROUND, **** )函 数 可 以 改 变 窗 口 背 景 色 , 在 适 当 的 位 置 加 上 它 即 可 , 其 中 第 二 个 变 量 可 以 为 以 下 值 :
BK_BLUE BK_MAGENTA BK_PINK BK_YELLOW
BK_GREEN BK_ORANGE BK_RED
以 上 几 种 为 渐 变 色
BK_SOLIDBLACK BK_SOLIDMAGENTA BK_SOLIDRED
BK_SOLIDBLUE BK_SOLIDORANGE BK_SOLIDWHITE
BK_SOLIDGREEN BK_SOLIDPINK BK_SOLIDYELLOW
同 时 第 二 个 参 数 也 可 以 用 RGB来 描 述 , 如 SetColor( BACKGROUND, RGB(0,0,255) )
3.怎 样 在 InstallShield5.0以 下 版 本 建 立 快 捷 方 式
在 InstallShield5.1以 上 版 本 可 以 可 以 在 Resource窗 口 中 建 立 , 而 在 以 前 的 版 本 必 须 用 程 序 解 决 该 问 题 , 如 果 现 在 有 一 文 件 RegPad.exe( 安 装 路 径 为 用 户 选 定 的 ) , 给 该 程 序 在 “ 开 始 ” ->“ 程 序 ” 中 加 一 个 快 捷 方 式 , 具 体 实 现 程 序 如 下 :
function SetupFolders()
NUMBER nResult;
STRING svResult,szCommand;
STRING szName;
begin
szName = "RegPad.exe";
szCommand = TARGETDIR ^ szName ;
LongPathToQuote ( szCommand , TRUE );
AddFolderIcon ( FOLDER_PROGRAMS ^"RegPad1.0Beta","RegPad" ,
szCommand , TARGETDIR , "" , 0 , "" , REPLACE );
4.怎 样 控 制 用 户 序 列 号
在 向 导 生 成 的 框 架 程 序 中 , 定 义 了 一 个 STRING型 的 全 局 变 量 svSerial, 在 SdRegisterUserEx()结 束 时 将 给 该 值 赋 上 用 户 输 入 的 序 列 号 , 你 对 该 变 量 进 行 判 断 即 可 。
5.怎 样 控 制 重 新 启 动 计 算 机
只 需 加 入 以 下 语 句
System ( SYS_BOOTWIN );
6.怎 样 给 Autoexec.bat或 Config.sys加 入 语 句
以 下 程 序 给 Autoexec.bat加 入 一 行 语 句
OpenFileMode ( FILE_MODE_APPEND );
OpenFile (nvFileHandle, "C:\\", "Autoexec.bat");
WriteLine ( nvFileHandle , "SET PATH=%PATH%;C:\\ORAWIN95\\BIN" );
7.怎 样 在 安 装 结 束 时 允 许 用 户 选 择 是 否 打 开 Readme文 件
假 定 Readme.txt文 件 已 经 复 制 到 目 标 路 径 , 以 下 程 序 将 显 示 一 个 复 选 框 , 如 果 用 户 选 择 了 , 则 用 记 事 本 打 开 Readme.txt。
function DialogShowSdFinishReboot()
NUMBER nResult, nDefOptions;
STRING szTitle, szMsg1, szMsg2, szOption1, szOption2,szPathls;
NUMBER bOpt1, bOpt2;
begin
if (!BATCH_INSTALL) then
bOpt1 = TRUE;
bOpt2 = FALSE;
szMsg1 = "";
szMsg2 = "";
szOption1 = "阅 读 Readme文 件 ";
szOption2 = "";
nResult = SdFinish( szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2 );
if bOpt1 = TRUE then
CopyFile ( "Readme.txt" , "Readme.txt" );
LaunchApp ( WINDIR^"Notepad.exe" , TARGETDIR^"Readme.txt" );
endif;
return 0;
endif;
..........
8.如 何 指 定 默 认 路 径
在 function SetupInstall()中 修 改 以 下 代 码 , 如 默 认 目 录 改 为 C:\JttMis, 见 以 下 修 改 的 代 码
if (bIs32BitSetup) then
svDir = WINDISK ^ "Jttmis";
else
svDir = WINDISK ^ "Jttmis"; // use short names
endif;
TARGETDIR = svDir;