| 改进VB3.0的安装程序生成器 |
当 软 件 的
整 体 开 发 结 束 之 后, 为 使 用 户 能 够 安 全、 方 便 地 使 用
软 件, 制 作 一 个 美 观、 可 靠 的 安 装 程 序 是 十 分 重 要
的。 目 前 市 场 上 流 行 的 天 汇 PcInstall 软 件, 是 制 作 安 装
程 序 较 理 想 的 工 具, 但 要 制 作 比 较 复 杂 的 安 装 程 序,
就 要 花 一 定 时 间 来 研 究 其 操 作 手 册。 如 果 使 用 VB3.0 作
为 软 件 开 发 工 具, 利 用 其 中 专 门 用 来 制 作 安 装 程 序 的
SetupWiz-ard, 也 可 以 很 快 制 作 出 简 单 的 安 装 程 序, 这 对 于
一 般 的 VB3.0 程 序 员 可 能 早 已 熟 悉。 但 由 SetupWizard 制 作 出
的 安 装 程 序 界 面 比 较 简 单 而 且 不 太 美 观, 仅 仅 实 现 了
最 一 般 的 安 装 功 能, 对 于 要 求 较 高 的 软 件 来 说, 显 得
有 点 寒 酸。 由 于 SetupWizard 给 我 们 提 供 了 安 装 程 序 的 源 代
码, 因 此 通 过 分 析 改 进, 我 们 可 以 制 作 出 全 新 面 目 的
安 装 程 序。 笔 者 由 于 工 作 的 需 要, 仔 细 分 析 了 SetupWizard
的 结 构 和 机 制, 对 其 进 行 了 一 些 改 进。 SetupWizard 的 机 制1.SetupWizard 的 结 构 在 VB\setupKit\ 目 录 下, 包 括 两 个 子 目 录, \kitFiles 和 \setup1。 制 作 SETUP 的 库 文 件 存 放 在 \ketFiles 目 录 下, 其 中 最 重 要 的 是 : Ver.dll — — — 包 含 安 装 程 序 中 确 定 拷 贝 文 件 版 本 所 需 的 接 口 函 数; setupkit.dll — — — 包 含 确 定 安 装 所 需 空 间 和 拆 分 大 文 件 等 功 能 的 接 口 函 数; Setuplist — — — 包 含 运 行 安 装 程 序 初 始 化 时 需 要 展 开 的 三 个 压 缩 文 件, setup1.ex_, setupKit.DL_, VBRUN300.DL_, 其 中 setup1.ex_ 是 VB 生 成 的 安 装 程 序, VBRUN300.DL_ 是 运 行 VB 可 执 行 程 序 的 支 持 文 件。 在 \setup1 下, 存 放 生 成 安 装 程 序 的 源 文 件 : setup1.mak — — — 安 装 程 序 的 工 程 文 件; setup1.frm — — — 安 装 程 序 的 主 窗 体。 控 制 安 装 流 程; message.frm — — — 用 来 显 示 安 装 过 程 中 一 些 消 息; path.frm — — — 输 入 安 装 路 径 的 窗 体; status.frm — — — 显 示 安 装 进 程 的 窗 体; setup1.glb — — — 声 明 安 装 程 序 所 需 的 类 型 定 义 和 调 用 函 数; setup1.bas — — — 安 装 程 序 中 所 需 的 函 数 和 过 程 代 码。 2.SetupWizard 的 工 作 原 理 SetupWizard 的 工 作 原 理 有 些 类 似 于 Word 中 的 模 板, 它 以 setup1.mak 为 模 板, 生 成 一 个 setup1.exe, 对 于 不 同 的 应 用 程 序, 它 只 是 自 动 更 改 其 核 心 内 容, 如 要 拷 贝 的 文 件 等, 而 其 它 的 界 面 内 容 不 变, 这 就 为 我 们 制 作 通 用 的 安 装 程 序 提 供 了 方 便。 生 成 Set-up1.exe 后, 先 把 它 压 缩 成 setup1.ex_, 再 由 SetupWizard 调 用 内 部 库 (不 可 见) 生 成 setup.exe 和 setup1.lst 文 件, setup.exe 就 是 我 们 安 装 时 所 能 运 行 的 文 件, 它 并 不 是 真 正 实 现 安 装 过 程 的 程 序。 所 有 生 成 的 文 件, 在 没 有 退 出 SetupWizard 之 前, 都 保 存 在 VB\setupkit\setupwiz 这 个 临 时 目 录 下, 我 们 可 以 切 换 到 文 件 管 理 器 下, 查 看 这 些 文 件。 在 退 出 SetupWizard 后, 该 目 录 被 删 除。 当 安 装 运 行 setup.exe 时, setup.exe 首 先 把 在 setup.lst 中 列 出 的 文 件 setup1.ex_, setupKit.DL_, VBRUN300.DL_ 依 次 解 压 并 拷 贝 到 相 应 的 目 录, 然 后 调 用 setupKit.DLL 库 函 数 进 行 查 看 硬 盘 空 间 等 初 始 化 工 作, 如 果 成 功, 则 在 VBRUN300.DLL 的 支 持 下 运 行 setup1.exe 文 件, 进 行 真 正 的 安 装 工 作。 SetupWizard 的 改 进由 上 可 知, 我 们 只 要 改 动 VB\setupKit\setup1 目 录 下 setup1.mak 中 的 文 件, 就 可 以 创 建 我 们 自 己 风 格 的 SETUP 模 板, 以 后 由 SetupWizard 生 成 的 安 装 程 序, 都 具 有 了 该 风 格。 比 如 我 们 可 以 把 程 序 中 全 部 英 文 提 示 翻 译 成 中 文, 以 后 所 有 生 成 的 安 装 程 序 界 面 就 都 汉 化 了, 而 不 必 每 次 都 做 同 样 的 工 作。 对 于 一 般 的 改 进, 可 参 照 setup1.frm 的 源 代 码 进 行 修 改 (顺 便 说 一 句, setup1.bas 中 所 包 含 的 许 多 函 数 及 其 编 程 风 格, 值 得 我 们 借 鉴 和 学 习)。 分 析 Setup1.mak 可 知, 该 程 序 只 用 到 VB3.0 中 最 基 本 的 一 些 控 制, 而 一 些 能 够 为 我 们 程 序 生 色 的 控 件 如 Threed.VBX, PicClip.VBX 却 没 用 到, 为 使 安 装 程 序 能 够 具 有 漂 亮 的 三 维 风 格, 就 需 要 在 模 板 程 序 Setup.mak 中 引 入 Threed.VBX, 但 由 于 SetupWizard 的 标 准 中 不 承 认 另 外 加 入 的 控 制, 当 它 检 查 到 setup.mak 中 有 外 来 的 VBX 控 制 时, 会 造 成 生 成 安 装 程 序 的 第 五 步 无 法 进 行 下 去, 对 于 这 个 问 题, 笔 者 采 用 一 个 “偷 梁 换 柱” 的 方 法, 成 功 地 在 安 装 程 序 中 实 现 了 三 维 安 装 界 面。 下 面 简 述 其 步 骤 : 1. 进 入 VB3.0, 调 入 setup1.mak 文 件, 单 击 File|Add File 菜 单, 调 入 Windows\system\Threed.VBX, 这 时 工 具 条 (TOOL BOX) 中 新 增 了 许 多 具 有 三 维 特 性 的 工 具。 2. 在 Setupl.frm 或 其 它 窗 体 上 增 加 三 维 特 性, 例 如 可 以 在 Setup1.frm 上 增 加 一 个 三 维 面 板 Pannel3D1, 设 置 其 字 体 的 立 体 效 果。 改 变 该 窗 体 上 DrawBackground 函 数, 使 原 来 显 示 在 窗 体 上 的 标 题 由 三 维 面 板 来 显 示, 程 序 附 后。 同 时 也 可 以 改 变 其 它 窗 体 上 的 字 体 和 背 景 颜 色, 使 其 更 加 美 观 并 与 整 体 效 果 协 调。 3. 全 部 文 件 以 文 本 格 式 存 盘 退 出。 在 文 本 编 辑 器 中 查 看 setup1.mak, 可 发 现 其 中 多 了 一 行, C:\windows\system\Threed.VBX, (假 设 Windows 安 装 在 C 盘)。 删 掉 这 一 行, 否 则 SetupWizard 无 法 运 行。 4. 运 行 SetupWizard, 加 入 应 用 程 序 的 mak 文 件, 运 行 到 第 五 步 时, 按 “NEXT” 按 钮, 此 时 要 进 行 压 缩 文 件 及 生 成 Setup.exe 和 Setup1.exe 的 工 作, 当 生 成 setup1.exe 时, 会 有 警 告, 因 为 这 时 setup1.mak 中 不 包 含 Threed.VBX, 而 程 序 中 却 要 用 到, 忽 略 其 警 告, 继 续 执 行 下 去。 此 时 生 成 的 setup1.exe 是 没 有 用 的, 我 们 只 是 利 用 SetupWizard 压 缩 文 件 和 生 成 Setup.exe。 5. 经 过 上 面 步 骤 之 后, SetupWizard 把 文 件 都 准 备 好 了, 并 保 存 在 VB\setupKit\kitFiles\setWiard 这 个 临 时 目 录 中, 切 换 到 文 件 管 理 器 可 以 看 到 这 个 目 录。 此 时 如 果 查 看 setup1.lst, 就 会 发 现 其 中 多 了 一 个 文 件 three3d.VBX, 这 样 初 始 化 时 就 会 先 把 它 拷 入。 当 提 示 插 入 1 号 盘 时, 选 择 “取 消” 按 钮, 因 为 这 时 的 Setup1.exe 并 不 是 我 们 真 正 需 要 的, 如 果 用 此 时 生 成 的 安 装 程 序 进 行 安 装, 则 界 面 不 会 有 三 维 特 征。 6. 下 面 该 生 成 真 正 的 Setup1.exe 了, 切 换 到 文 本 编 辑 器 下 (注 意 此 时 不 要 退 出 Set-upWizard, 否 则 就 前 功 尽 弃 了), 打 开 刚 才 编 辑 过 的 setup1.mak, 加 入 C:\windows\system\threed.VBX 这 一 行, 存 盘 退 出, 并 回 到 SetupWizard 下。 7. 再 按 “NEXT” 按 钮, 此 时 由 于 应 用 程 序 文 件 都 已 压 缩 过, 而 且 setupe.exe 也 生 成 了, 只 需 用 SetupWizard 重 新 生 成 setup1.exe, 并 把 它 压 缩 成 setup1.ex_ 文 件。 这 才 是 在 Threed.VBX 支 持 下 生 成 的 真 正 具 有 三 维 特 征 的 主 安 装 文 件。 以 后 在 制 作 其 它 安 装 程 序 时, 不 必 每 次 都 改 动 setup1.frm 的 代 码, 就 可 以 制 作 出 独 特、 具 有 统 一 风 格 界 面 的 安 装 程 序。 这 对 于 较 专 业 的 软 件 编 制 单 位 或 个 人 来 说, 是 很 有 意 义 的。 对 于 其 它 VB3.0 支 持 的 控 件, 可 采 用 同 样 的 方 法 处 理。 一 般 较 专 业 的 安 装 程 序 在 安 装 结 束 后, 会 自 动 启 动 一 个 文 本 文 件, 该 文 件 中 包 括 了 软 件 运 行 时 需 要 注 意 的 问 题, 以 及 在 发 行 软 件 前 对 软 件 的 最 新 改 进 信 息。 SetupWizard 并 没 有 提 供 这 一 功 能, 但 只 要 对 setup1.frm 的 代 码 略 作 改 进 就 可 实 现。 程 序 2 中, 在 安 装 工 作 完 成 后, 启 动 Windows 目 录 下 的 记 事 本 (notePad.exe), 来 打 开 setup.txt(名 字 可 随 意 起) 文 件, 需 要 注 意 的 是, 该 文 本 文 件 在 SetupWizard 进 行 到 第 五 步 时, 一 定 要 加 入 到 压 缩 程 序 列 表 中。 另 外, SetupWizard 还 有 一 个 小 缺 憾, 就 是 软 件 中 如 果 使 用 了 数 据 库, 在 运 行 安 装 程 序 时, 它 只 是 提 示 用 户 在 AUTOEXEC.BAT 文 件 中 加 入 share.exe 文 件, 而 并 没 有 自 动 修 改, 这 一 点 给 不 太 熟 练 微 机 操 作 的 用 户, 容 易 造 成 不 便。 笔 者 更 改 了 setup1.bas 中 AddShareIfNeeded 函 数, 在 其 中 添 加 下 面 几 行, 就 很 好 地 解 决 了 问 题。 Open “C:\AUTOEXEC.BAT” For Append As fh% Print #fh%, SharePath$+“SHARE.EXE /L:500” MsgBox “已 更 改 AUTOEXEC.BAT, 安 装 结 束 后 要 重 新 启 动 计 算 机。” Close#fh% 随 着 对 setup1 源 程 序 不 断 完 善, 安 装 模 板 上 的 功 能 也 越 来 越 多, 制 作 出 的 安 装 程 序 也 就 更 加 美 观, 专 业 化。 程 序 如 下 : 1. 利 用 三 维 面 板 来 显 示 标 题 Sub DrawBackground() setup1.ForeColor=RGB(0, 0, 255) ‘设 置 主 窗 体 的 背 景 色 Pannel3dl.move 0, 0 ‘将 三 维 模 板 移 动 到 安 装 主 窗 体 的 左 上 端 Pannel3dl.caption=APPNAME+“安 全” ‘在 三 维 面 板 上 写 安 装 程 序 名 End Sub 2. 修 改 AUTOEXEC.bat 文 件, 安 装 结 束 后 启 动 记 事 本 安 装 程 序 的 主 控 程 序 在 setup1.frm 的 Form_Load 中 form_Load() ‘略 ‘生 成 程 序 组 和 程 序 项 图 标 CreateProgManGroup setup1, “LOANSHEET”, “LOAN.GRP” CreateProgManItem setup1, destPath$+“LOAN.EXE”, “LOANSHEET” ‘主 程 序 项 CreateProgManItem setup1, destPath$+“LOAN.hlp”, “LOANHELP” ‘帮 助 程 序 项, SetupWizard 自 动 根 据 应 用 程 序 的 mak 文 件 中 所 包 含 的 *.hlp 文 件 生 成。 ‘修 改 AUTOEXEC.bat 文 件 If fDataAccess%Or fOLE2% And Not FileExists(winSysDir$+“\” +“OLE2.DLL”) Then ret$=Space$(255) X%=GetPrivateProfileString(“BOOT”, “NETWORK.DRV”, “”, ret$, Len(ret$), “SYSTEM.INI”) If X% Then ret$=Left(ret$, X%) If InStr(1, UCase$(ret$), “WFWNET.DRV”) =0 Then AddShareIfNeeded winSysDir$, “SHARE.EXE” ‘加 入 SHARE.EXE End If End If MsgBox APPNAME+“安 装 结 束 !”, 48, dialogCaption$ If FileExists(winDir$+“\” +“notePad.exe”) Then ‘显 示 SETUP.TXT X%=Shell(winDir$+“notePad.exe” +“” +destPath$+“setup.txt”, 1) End If Exit sub ‘略 … End sub |