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;

posted on 2007-06-30 14:26  draeag  阅读(1075)  评论(0编辑  收藏  举报