0

基本的に、特定のハードウェアがインストールされているかどうかを検出するために devcon.exe (Windows ハードウェア マネージャーのコマンド ライン バージョン) を実行できる WIX msi を構築しようとしています。そうである場合は、msi A をインストールし、そうでない場合は msi B をインストールします (A と B は、別の msi パッケージとして既に存在します。ハードウェアに基づく自動選択インストールが必要です)。

現在、WIX SDK をインストールし、msi を正しくビルドする WIX プロジェクトを作成しました。CustomActions を実行して notepad.exe を開くなど、簡単なことを実行できます。

1 番目の問題: ディレクトリにインストールされないファイルをインストーラーにパッケージ化する方法がわかりません。私はそれへの参照を見つけましたが、それを行う方法を明示的に述べている場所はどこにもありません. ホスト ドライブにインストールしない場合は、「Directory」タグ内に配置する必要はありませんよね?

2 番目の問題: devcon.exe は (私が知る限り、間違っている場合は訂正してください) 検出した内容に応じて戻り値を変更しているようには見えません。ハードウェア デバイスが存在するかどうか。したがって、それを埋め込んで実行できる場合は、何らかの方法で標準出力ストリームに出力するものを取得し、探している特定の値を解析する必要があります。

もちろん、解析を実行し、知る必要があることを教えてくれる環境変数を設定できるバッチ ファイルを既に持っているので、少し簡単ですが、両方を埋め込むことができれば、どうすれば取得できますか埋め込まれたdevcon.exeを参照するバッチファイルを作成し、WIXに変数を読み取らせるか、またはWIXで変数(またはプロパティ)を設定してからバッチファイルから設定できますか?

たぶん、代わりに dll カスタム アクションを作成する必要がありますか? 埋め込まれた実行可能ファイルを dll カスタム アクションから実行することはできますか? 次に、devcon.exe を実行し、そこですべての解析を行い、次に何をするかを選択するために Wix 変数またはプロパティを設定するだけです。

3 番目の問題: ある msi を別の msi から実行できること。私はまだこれに慣れていませんが、すべてを読んだわけではありませんが、有望に見える (http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html) を見つけました。まだ。一度に1つの問題、私は確かにもう十分です:)

4

2 に答える 2

0

2 番目の問題については、devcon.exe を起動し、その出力を読み取って解析する EXE または DLL カスタム アクションを作成します。devcon.exe 自体は EXE/DLL のリソースに格納され、開始前に一時ディレクトリに抽出され、使用が終了したら削除されます。

DLL を選択すると、MSI パブリック プロパティを変更できます。そうすれば、MSI で次に何が行われるかを制御するプロパティを設定できます。

EXE を選択した場合は、終了コードしかありません。私の知る限り、実際に MSI でできることはあまりありません。


MSI インストールの連鎖はお勧めしません。両方のドライバーを 1 つのパッケージに組み込み、devcon.exe 検出の結果として設定されたプロパティに応じて、インストールするコンポーネントを選択できます。


もう 1 つの方法は、devcon.exe を実行し、インストールするパッケージを決定するブートストラップ 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 に答える