65.9K
CodeProject 正在变化。 阅读更多。
Home

易于安装的安装程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (52投票s)

2004 年 11 月 19 日

CPOL

11分钟阅读

viewsIcon

293860

downloadIcon

3757

易于安装的安装程序

对于那些想要一个极其简单的安装程序的人,这里是最初的 EasyInstaller 版本 1。

Create Installer screenshot

Target Installer screenshot

最新更新

版本 2.4 - 在 Windows 版本选项中添加了 Vista,并修复了一些错误。

版本 2

此版本有以下增强功能

  • 改进的用户界面 - 目标安装程序现在是向导风格的。
  • 许可页面 - 用户可以指定一个可选的许可页面,以显示在安装程序中。可执行文件的安装程序中显示的那个,是对 zip.cpp 文件中 Info-Zip 许可证有点无耻的复制和改编。
  • 信息页面 - 用户可以在安装程序中显示一个可选的信息页面,用于告知用户新功能或特殊细节。
  • 检查项目 EXE 是否正在运行 - 安装程序现在会在继续安装之前检查项目中的任何 EXE 文件是否正在运行。

尚待完成(不一定由我来做 :-))

  • 进度和完成页面 - 如果用户点击“完成”后能有一个进度页面,这样他们就能知道发生了什么,那就太好了。然后一个“安装成功完成”的提示会给用户一种他做对了某件事的温暖模糊的感觉。
  • CreateInstaller 的选项卡式(?)界面 - CreateInstaller 程序的用户界面有点拥挤。然而,由于我个人更喜欢一次性看到所有细节,而不是通过不同的选项卡翻页,所以我保持了原样。这也为我省去了修改程序的麻烦。如果将来再增加一个安装项,用户界面可能就需要某种形式的改造了。
  • 文件的相对路径 - 这将允许文件安装在不同的位置。我不太确定最好的方法(用户界面)是什么。一旦弄清楚了,代码就会跟上。不管怎样,坦白说,我现在懒得去想这个问题。

引言

我需要一个简单的安装程序来用于我的一个共享软件/公平软件,但我就是找不到适合我需求的。我想要一个能合理地自动创建安装可执行文件的方法,但我不想花几个小时学习脚本或复杂的设置。经过长时间的搜索,我发现了一些不错的程序,可以创建 SFX 文件(自解压可执行文件),但我要么编译时遇到麻烦,要么它们的行为不符合我的期望。

过了一段时间,我找到了 Kaushal Malhotra 编写的一款不错的 SFX 构建器 ExeCreator Utility。它也没有真正给我我想要的。仅仅能够将我的文件打包成一个 SFX 对我来说还不够。然而,它给了我一个方向和一个好的开始。然后我决定是时候亲自动手,开始玩乐高 (tm) 了。ExeCreator 将作为那块作为基础的大绿色乐高积木。其余的部分如下 (新内容以粗体显示)

  • 压缩 - 生成的安装文件太大了,所以我需要一个压缩工具。Lucian Wischik 的 Zip Utils 正是我所寻找的。Lucian 的工具是 Info-Zip 源代码的易于使用的重新打包形式,源代码可从此处获取。几分钟之内,我就有了一个压缩的 SFX。对于版本 2,我需要应用此论坛帖子中描述的修复。这是因为我决定将所有文件压缩成一个大的 ZIP 文件,而不是像第一个版本那样每个文件单独压缩。
  • 快捷方式 - 大多数安装程序都允许用户创建桌面、开始菜单和启动快捷方式。我找到了一些我之前玩过的代码来实现这个功能,我相信这些代码是基于 PJ Naughter 和 Igor Vigdorchik 的工作。
  • 网站链接 - 为了在安装程序中包含一个网站链接,我使用了 Hans Dietrich 的 XHyperLink
  • 项目配置 - 我希望能够定义和保存安装项目。我添加了一些代码,用于将项目设置保存在一个 INI 文件中。这个文件位于 CreateInstaller 程序所在的目录,如果需要,可以轻松移动到其他机器上。我不喜欢使用注册表——这对我来说有点像宗教信仰。
  • Windows 版本 - 由于我的公平软件只在 Windows 2K 和 XP 上运行,我想我应该添加一种方式,让用户可以指定安装程序应该在哪几个 Windows 版本上工作。为此,我使用了 Hans Dietrich 在他的 FontFile demo 中的 GetWinVer 函数。
  • 创建安装路径 - Windows 函数 _access() 检查安装目录路径是否已存在。如果目录不存在,Arlen Albert 的 MakeSurePathExists() 会创建路径中的每个目录,直到到达最终目标目录。现在使用 MakeSurePathExists() 是因为微软的 MakeSureDirectoryPathExists() 在 Win 95/98/NT 上不可用。
  • 注册 DLL - 首先检查 DLL 是否可以注册。如果可以,WinExec() 会调用“regsvr32.exe”。根据 MSDN,WinExec() 仅为与 16 位 Windows 兼容而存在,应该改用 CreateProcess()。我读了三次关于 CreateProcess 的材料,但仍然不理解。我要么懒,要么笨(也许两者都是),但我不在乎。WinExec() 工作得很好,所以对我来说,它是一个很好的选择。
  • 检测项目 EXE 当前是否正在执行 - 安装程序现在会检查项目中的任何 EXE 是否正在运行。如果是,它会提示用户在继续安装之前关闭所有程序。我怎么也想不起来在哪里找到这段代码了。如果有人知道,请告诉我,我会在这里加上相应的致谢。
  • 向导式安装程序 - 我认为改善安装程序外观的最佳方法是将其变成一个向导。我在 CodeProject 上找到了 Robert Pittenger 的一个不错的向导项目,正好符合要求。

经过这一切,Kaushal 的代码已经面目全非了。事实上,它几乎找不到了。但尽管如此,它仍然是 Easy Installer 坚固的乐高基础,是它给了我一个起点。

理念

我想要一个易于使用的安装程序,而且我对结果很满意。没有脚本,没有复杂的任务,意味着没有学习曲线。

EasyInstaller 的目的不是为了获得投票,它也永远不会与 InstallShield 相媲美。它只是我为自己使用而拼凑起来的一个小东西。我对结果很满意,我正在用它来分发我的公平软件。说实话,我正在使用(或者至少曾经使用)的版本远没有我提交的版本那么完善。提交一个乱七八糟的东西并期望别人能从中受益似乎不太对。

如果你觉得它有用,那太好了。如果你认为它缺少什么,那就告诉我,我会看看我能做些什么。如果你认为它缺少的是脚本,那就别想了。我几乎可以保证 EasyInstaller 永远不会有脚本功能。

使用安装程序

项目可以被命名和定义。定义一个项目非常简单。给它起个名字后,你添加你想要打包到安装程序中的文件,检查 Windows 版本,并为其指定一个输出名称。你可以选择性地提供一个网站链接。填写标题和 URL 字段。如果只提供了 URL(没有标题),那么 URL 将原样显示在安装程序中。如果没有提供 URL,那么安装程序中将不会出现链接。当你点击“创建”时,它会创建将用作安装程序的可执行文件。当前设置也会保存在一个 .ini 文件中,该文件位于 CreateInstaller 可执行文件所在的目录。点击“保存项目”以保存更改而不创建安装程序。

项目可以被修改或复制。从列表中选择一个项目并修改设置。如果你给它一个新名字,你就创建了一个新项目。如果你不再需要某个项目,从列表中选择该项目并点击“删除项目”。

版本 2 新增 - 创建安装程序时,你现在可以选择性地指向一个许可协议文件和一个信息文件。这些文件将在目标安装程序向导中各自的页面上显示。

版本 2 新增 - 创建的安装程序会检查当前项目名称的可执行文件(例如:CurrentProject.exe)是否正在运行。如果是,它会通知用户必须在继续安装前终止该程序。

安装程序允许用户请求创建桌面快捷方式和启动快捷方式。唯一的要求是,要创建快捷方式的 .exe 文件必须与项目同名。例如,如果你有一个名为 SuperApp 的项目,它会创建指向 SuperApp.exe 的桌面和启动快捷方式。我希望在未来的版本中使这个功能更灵活一些。

如果用户选择创建开始菜单链接,那么安装程序会为所有可执行文件在与项目同名的开始菜单目录中创建一个链接。

我的代码

好的,在你感到沮丧之前,让我解释一点。当你在调试模式下编译项目时,你会得到一个 Installer.exe 丢失的错误。你可以更改资源文件中的路径,使其指向调试版的 Installer.exe,或者先在发布模式下构建。这将创建该文件,你就不会收到错误消息了。我确信有更好的方法来做到这一点,但我不知道。如果你知道怎么做,请告诉我,我会修复这个项目。

没什么特别的——实际上,相当粗糙快捷。这个项目开始时是一个乐高项目,我只是不断地(用脏手)修改它,直到我得到我想要的结果。

关于 Unicode 友好代码,我做得不太一致(好吧,实际上是相当马虎)。我会在下一次迭代中尝试清理这一点。(是的,你说得对——我在版本 2 中甚至没有尝试清理这个。抱歉。)

开发是在 VS7 下完成的。我没有真正计划将其移植到 VS6,因为我没有时间。我看不出有什么理由它不能在 VS6 下工作。如果有人愿意做移植工作,我很乐意将更改合并进来。

MFC 是静态链接的。我第一次使用它时,有人抱怨“缺少一个 DLL”。嗯,我怎么就没预料到呢?总之,静态链接 MFC 会使最终的安装程序稍大一些,但可以避免麻烦和头痛。如果你能接受动态链接,那就去做吧。

历史

没有 beta 版、预发布版或候选发布版。只是根据需要或心情偶尔发布一个版本。我没有时间进行版本控制或复杂的测试程序。事实上,我几乎没有时间顾及个人卫生。

  • 版本 2.4 - (2006年9月13日) - 在 Windows 版本选项中添加了 Vista。修复了许可和信息例程中的一个错误,其中分配的内存块短了一个字节,没有为分隔符留出空间。修复了创建已存在的安装程序时的错误。我想还有几个其他的错误修复,但我不记得是什么了(我没有做好记录)。
  • 版本 2.3 - (从未发布 - 太懒了)。
  • 版本 2.2 - (2005年2月20日) - 哎呀,又一个月,又一次更新 :-) 看起来 Easy Installer 已经有了自己的生命。我再次找到了一块现成的“乐高”(由 Arlen Albert 提供)来帮助我。他的例程 MakeSurePathExists() 是对例程 MakeSureDirectoryPathExists() 的替代,后者仅存在于 Win2K/XP 中。感谢 Testeer 和 Jean-Luc 指出这个问题。Easy Installer 现在应该可以在 Win9x/NT 下工作了。
  • 版本 2.1 - (2005年1月20日) - 许可和信息文件没有正确添加到安装程序中。此功能现在会在安装过程中将文件保存在目标目录中。
  • 版本 2.0 - (2004年12月22日) - 目标安装程序现在是一个向导;添加了许可和信息页面。
  • 版本 1.0 - (2004年11月15日) - 初始发布。

这次在创建新版本之前我得到了一些喘息的机会——主要是因为我从没有时间阅读 CP 上的评论,所以我从没动手做任何更改。我最终需要做一些更改,结果就是一个新版本。欢迎提出建议,但最终只会成为我桌上杂乱中丢失的便签。保重。

© . All rights reserved.