Quietモード実行 カスタムアクション

QtExec カスタムアクションは、サイレントモードの MSI ベースのセットアップで 任意のコマンド ラインを実行するのを 可能にします。QtExec は一般的に、コンソールウィンドウを抑制するのに 使われていて、さもなければ 実行ファイルを 直接実行している時に コンソールウィンドウが 現れる現れる。

カスタムアクションは、WixCA library 中にあり、それは WixUtilExtension の一部です。

即時実行

QtExec アクションが 即時カスタムアクションとして 実行される時、QtExecCmdLine プロパティに 保存されたコマンドを 実行しようと試みます。

以下は 即時 QtExec カスタムアクションを オーサリングする例です:

<!--  スケジュールに入れる  -->
<Property Id="QtExecCmdLine" Value="command line to run"/>
<CustomAction Id="QtExecExample" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="check"/>
.
.
.
<InstallExecuteSequence>
    <!--  実行インスタンス  -->
    <Custom Action="QtExecExample" After="TheActionYouWantItAfter"/>
</InstallExecuteSequence>

これは、即時シーケンスでコマンドラインを実行する事に帰着します。もし この例でのコマンド ラインの Exit コードが エラーを示せば(戻り値が 0 でない事を意味する)、Return の値が "check" にセットされているので セットアップは失敗します。Return の値を "ignore" に変更する事で、 失敗をログに記録しますが セットアップ全体を失敗する代わりに それをスキップして セットアップ を続行させます。

もし 即時シーケンスで1つだけでなくコマンドラインを実行したいなら、多重の QtExec カスタム アクションをスケジュールに入れて、QtExec カスタムアクションの各インスタンスの前に プロパティをセットしたカスタムアクションをすぐにスケジュールに入れる事によって、 QtExecCmdLine プロパティに 新しい値をセットする必要があります。

遅延実行

QtExec アクションが 遅延カスタムアクションとして 実行される時、カスタムアクション データの 値に保存されたコマンドラインを 実行しようと試みます。遅延 QtExec カスタムアクションに関して は、カスタムアクション データは、カスタムアクション id と同じ id 値を持つ プロパティです。

以下は 遅延 QtExec カスタムアクションを オーサリングする例です:

<Property Id="QtExecDeferredExample" Value="command line to run"/>
<CustomAction Id="QtExecDeferredExample" BinaryKey="WixCA" DllEntry="CAQuietExec"
              Execute="deferred" Return="check" Impersonate="no"/>
.
.
.
<InstallExecuteSequence>
    <Custom Action="QtExecDeferredExample" After="TheActionYouWantItAfter"/>
</InstallExecuteSequence>

もし 他の Windows Installer プロパティを使用するコマンドラインをセットする必要があれば、 コマンドライン プロパティ値をセットするのに 即時カスタムアクションをスケジュールに入れ、 QtExec を実行する 遅延カスタムアクションをスケジュールに入れなければ なりません。 即時カスタムアクションで使われるプロパティ値は、遅延カスタムアクションで使われる id 値に 一致しなければ なりません。QtExec カスタムアクションの為のこのパターンの一般的使用は、 セットアップの一部としてインストールされる実行形式ファイルを 実行する為です。

以下は、別のプロパティ値を当てにする 遅延 QtExec カスタムアクションを オーサリングする例 です:

<CustomAction Id="QtExecDeferredExampleWithProperty_Cmd" Property="QtExecDeferredExampleWithProperty"
              Value="&quot;[#MyExecutable.exe]&quot;" Execute="immediate"/>
<CustomAction Id="QtExecDeferredExampleWithProperty" BinaryKey="WixCA" DllEntry="CAQuietExec"
              Execute="deferred" Return="check" Impersonate="no"/>
.
.
.
<InstallExecuteSequence>
    <Custom Action="QtExecDeferredExampleWithProperty_Cmd" After="CostFinalize"/>
    <Custom Action="QtExecDeferredExampleWithProperty" After="TheActionYouWantItAfter"/>
</InstallExecuteSequence>

64ビット実行形式ファイルの実行

もし 64ビット実行形式ファイルを実行する必要があれば、64ビット用 QtExec を使って下さい。 64ビット用 QtExec を使うには、カスタムアクション エレメントの DllEntry アトリビュートを "CAQuietExec64" に変え、即時実行に関しては "QtExec64CmdLine" プロパティを使って下さい。

以下の例は、上の例を 両方に関して64ビットQtExec用に 組み合わせています。カスタム アクション エレメントの id アトリビュートは 変える必要がない事に 注意して下さい:

<Property Id="QtExec64CmdLine" Value="64-bit command line to run"/>
<CustomAction Id="QtExecExample" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="immediate" Return="check"/>
.
.
.
<CustomAction Id="QtExecDeferredExampleWithProperty_Cmd" Property="QtExecDeferredExampleWithProperty"
              Value="&quot;[#MyExecutable.exe]&quot;" Execute="immediate" Return="ignore"/>
<CustomAction Id="QtExecDeferredExampleWithProperty" BinaryKey="WixCA" DllEntry="CAQuietExec64"
              Execute="deferred" Return="check" Impersonate="no"/>
.
.
.
<InstallExecuteSequence>
    <Custom Action="QtExecExample" After="TheImmediateActionYouWantItAfter"/>

    <Custom Action="QtExecDeferredExampleWithProperty_Cmd" After="CostFinalize"/>
    <Custom Action="QtExecDeferredExampleWithProperty" After="TheDeferredActionYouWantItAfter"/>
</InstallExecuteSequence>

QtExec を使う MSI のビルド

QtExec を使う為に、MSI をビルドしている時に WixUtilExtension への参照を インクルード しなければなりません。これをするには、Light.exe をコールしている時に コマンドライン引数 -ext WixUtilExtension.dll を追加して下さい。