1

我们正在为 Windows Server 2008 更新我们产品的 .msi 包的构建。我们安装的主要组件是作为 Windows 服务运行的应用程序。还有一个配置应用程序在安装期间运行以设置注册表项以供服务使用。

服务和配置应用程序依赖于 Microsoft C/C++ 运行时和 MFC,它们作为合并模块包含在 .msi 中。C/C++ 运行时和 MFC 的程序集在 InstallFinalize 期间提交,这似乎阻止了使用 Windows Installer 提供的机制启动服务(这是正确的吗?)当然,我们看到并排错误与 at如果在 InstallFinalize 之前运行,则至少配置应用程序。

我们采用的方法是在 InstallFinalize 之后将配置应用程序作为“提交”自定义操作运行,并让该应用程序启动服务。这要求应用程序以提升的特权执行(为此我们使用包含 trustInfo 部分的清单。)这进一步要求 .msi 配置为在没有模拟的情况下运行此应用程序(否则会混淆特权提升。)

这是一种可接受的方法吗?这有多大可能是面向未来的?有什么需要注意的问题吗?

看来这是别人遇到过的问题:

http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg12666.html

是否有官方(或非官方)接受的方式来处理此类问题?

作为对此的补充,是否有任何方法可以确保在安装过程中作为自定义操作运行的应用程序在启动时获得焦点?以这种方式启动的应用程序似乎总是在安装程序后面弹出并且安装程序保持焦点,这不是一个特别用户友好的效果。

非常感谢,

布鲁斯。

4

2 回答 2

1

这是我在使用 Windows Installer 重新打包软件时用于解决此类问题的解决方案:“引导程序”启动器。简而言之,您可以执行以下操作之一,而不是使用运行时的合并模块(它将与所有其他已安装文件同时提交):

  1. 为运行时/MFC 提供可再分发的 MSI,并让它们首先由您的引导程序 setup.exe 启动。您的程序的 MSI 当然必须测试您需要的版本是否已安装,甚至可能进行测试以确保您从 setup.exe 运行它。(此方法由 InstallShield 推广,因为他们喜欢围绕 Windows Installer 进行最终运行。)

  2. 更好的是,您可以将您的 MSI 打包为安装两个(或更多)嵌入式 MSI 的父包:首先,安装所需的运行时,然后在子 MSI 中安装您的软件。您的父程序包将确认运行时的 MSI 已成功安装,然后继续安装您的 MSI(它可以自由启动服务,因为先决条件已经存在)。

还有其他一些棘手的方法,例如您的提前提交自定义操作,但它们不如我刚才提到的经过时间考验的方法可靠。

希望这是有道理的!我曾经在 MSI 生活和呼吸,但现在已经不是那么多了......

于 2009-07-30T21:18:27.123 回答
0
  1. 您可以编译您对 MFC&C-Runtime 的静态使用,这样您就不会被它所依赖。
  2. 您可以将 UI 添加到设置中,这将充当配置程序,因此您无需在设置期间运行配置程序(顺便说一句,这不是一个好主意)
  3. 您可以在禁用模式下安装服务,并在安装终止时运行配置。配置将负责激活服务。
于 2009-06-04T19:29:34.243 回答