2012-01-11 66 views
0

基本上我试图构建一个可以运行devcon.exe(Windows硬件管理器的命令行版本)来检测是否安装了特定硬件的WIX msi。如果是,则安装msi A,否则安装msi B(A和B已作为独立的msi软件包存在,我们需要基于硬件自动选择性安装)。试图从WIX msi运行嵌入式工具进行选择性安装

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

第一个问题:我无法找到如何将文件打包到不会安装到目录中的安装程序中。我找到了它的参考,但没有明确说明如何去做。如果它不会被安装到主机驱动器中,我不必将其放入'Directory'标签内,对吗?

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

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

也许我应该创建一个DLL自定义操作?是否有可能从dll自定义操作运行嵌入式可执行文件?然后我可以运行devcon.exe,并在那里进行所有解析,然后设置一个Wix变量或Property来选择接下来要做的事情。

第三个问题:能够从另一个msi运行一个msi。我还没有做到这一点,但我发现(http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html)看起来很有前途,尽管我还没有完全读过它然而。在时间的一个问题,我当然有足够的已经:)

回答

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为“否”并且执行为“deferred”),否则无法运行。

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

0

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

如果您选择DLL,您可以更改MSI公共属性。这样你就可以设置一个属性来控制MSI下一步将要做的事情。

如果您选择EXE,您拥有的只是退出代码。据我所知,MSI实际上并没有太多可以做的事情。


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


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