0

基本上,我正在尝试构建一个 WIX msi,它可以运行 devcon.exe(Windows 硬件管理器的命令行版本)来检测是否安装了特定的硬件。如果是,则安装msi A,否则安装msi B(A和B已作为单独的msi包存在,我们需要根据硬件自动选择性安装)。

目前我已经安装了 WIX SDK 并创建了一个正确构建 msi 的 WIX 项目。我可以做一些简单的事情,比如执行 CustomActions 来打开 notepad.exe,那种简单的事情。

第一个问题:我无法找出如何将文件打包到不会安装到目录中的安装程序中。我找到了对它的引用,但没有明确说明如何做到这一点。我不必将它放在“目录”标签中,如果它不会安装到主机驱动器上,对吧?

第二个问题:devcon.exe 没有(据我所知,如果我错了,请纠正我)似乎根据它发现的内容改变它的返回值,可能是因为它做了很多事情并且不限于是否硬件设备是否存在。因此,如果我可以将其嵌入并使其运行,那么我需要以某种方式将其输出到标准输出流中,然后将其解析为我正在寻找的特定值。

当然这会更容易一些,因为我已经有一个批处理文件可以进行解析并设置一个环境变量,它会告诉我我需要知道什么,但是,如果我可以将它们都嵌入,我怎么得到批处理文件来引用嵌入式 devcon.exe,然后让 WIX 读取变量,或者我可以在 WIX 中设置一个(或属性),然后从批处理文件中设置它?

也许我应该创建一个 dll 自定义操作?是否可以从 dll 自定义操作运行嵌入式可执行文件?然后我可以运行 devcon.exe,并在那里进行所有解析,然后只需设置一个 Wix 变量或属性来选择下一步做什么。

第三个问题:能够从另一个运行一个 msi。我还不太了解,但我发现(http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html)看起来很有希望,虽然我还没有通读然而。一次一个问题,我当然已经受够了:)

4

2 回答 2

0

对于第二个问题,我将创建一个 EXE 或 DLL 自定义操作来启动 devcon.exe,读取其输出并对其进行解析。devcon.exe 本身可以存储在 EXE/DLL 的资源中,并在启动前提取到临时目录中,然后在完成后将其删除。

如果您选择 DLL,您可以更改 MSI 公共属性。这样你就可以设置一个属性来控制接下来在 MSI 中要做什么。

如果您选择 EXE,您所拥有的只是退出代码。据我所知,实际上在 MSI 中你无能为力。


不建议链接 MSI 安装。您可以将两个驱动程序嵌入到一个包中,并根据 devcon.exe 检测结果设置的属性选择要安装的组件。


另一种方法是创建一个引导程序 EXE,它运行 devcon.exe 并确定要安装的包。然后它只是安装正确的 MSI 包。

于 2012-01-12T12:55:55.247 回答
0

好的,第一个问题解决了:

<Binary Id="Devcon" SourceFile="D:\Programming\Device_Selection\Device_Selection\devcon.exe"/>
<CustomAction Id="RunDevcon" BinaryKey="Devcon" ExeCommand="resources *vendor*device*" Return="check" Execute="deferred" Impersonate="no" />

这确保了 devcon.exe 工具嵌入在安装程序中,并且我可以在管理员模式下运行它(除非您将 Impersonate 指定为“no”并将 Execute 指定为“deferred”,否则它不起作用)。

接下来我需要做的是能够读取 devcon 通常发送到控制台的输出(即 cmd 窗口),然后解析它以获取信息。有没有办法捕获该输出?

于 2012-01-12T00:45:02.763 回答