簡體   English   中英

嘗試從WIX MSI運行嵌入式工具以進行選擇性安裝

[英]Attempting to run embedded tool from WIX msi for selective installation

基本上,我試圖構建一個可以運行devcon.exe(Windows硬件管理器的命令行版本)的WIX msi,以檢測是否安裝了特定的硬件。 如果是,則安裝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)看起來很有希望,盡管我還沒有閱讀全部然而。 一次有一個問題,我當然已經受夠了:)

好的,第一個問題已解決:

<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窗口),然后對其進行解析以獲取信息。 有沒有辦法捕獲該輸出?

對於第二個問題,我將創建一個EXE或DLL自定義操作,該操作將啟動devcon.exe,讀取其輸出並進行解析。 devcon.exe本身可以存儲在EXE / DLL的資源中,並在啟動前提取到一個臨時目錄中,然后在完成后將其刪除。

如果選擇DLL,則可以更改MSI公共屬性。 這樣,您可以設置一個屬性,該屬性將控制接下來在MSI中執行的操作。

如果選擇EXE,則僅是退出代碼。 據我所知,在MSI中您實際上無能為力。


不建議鏈接MSI安裝。 您可以將兩個驅動程序都嵌入一個程序包中,並根據devcon.exe檢測的結果,根據屬性集選擇要安裝的組件。


另一種方法是創建一個引導程序EXE,該程序運行devcon.exe並確定要安裝的軟件包。 然后,它僅安裝正確的MSI軟件包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM