zoukankan      html  css  js  c++  java
  • InstallShield脚本语言的编写

    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;

  • 相关阅读:
    Kubernetes 学习15 kubernetes 认证及serviceaccount
    Kubernetes 学习14 kubernetes statefulset
    Kubernetes 学习13 kubernetes pv pvc configmap 和secret
    Day_13【IO流】扩展案例2_统计指定项目文件中字符出现的次数
    Day_13【IO流】扩展案例1_读取项目文件内容并去重
    Day_12【集合】扩展案例4_判断字符串每一个字符出现的次数
    Day_12【集合】扩展案例3_产生10个长度为10,不能重复,由数字0-9,小写字母和大写字母组成的字符串
    Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组
    Day_12【集合】扩展案例1_利用集合的知识对长度为10的int数组进行去重,产生新数组,不能改变数组中原来数字的大小顺序
    Day_11【集合】扩展案例5_对list集合对象中的元素进行反转,求最大值最小值,求元素i在list集合中首次出现的索引,将oldvalue替换为newvalue
  • 原文地址:https://www.cnblogs.com/draeag/p/801356.html
Copyright © 2011-2022 走看看