9

私のプロジェクトには次の CustomAction があります。

<CustomAction Id="InstallDriver"
                  Return="check"
                  Execute="deferred"
                  Impersonate="no"
                  FileKey="FileDriverInst"
                  ExeCommand="-install" />

<InstallExecuteSequence>
    <Custom Action="InstallDriver" Before="InstallServices" />
</InstallExecuteSequence>

ドライバーをインストールするプログラムは、たとえば、以前のドライバーのアンインストール後にシステムを再起動する必要があるためにインストールが失敗した場合などに、有用なリターン コードを生成します。

現在、成功以外が返されると、「セットアップの一部として実行されたプログラムが期待どおりに終了しませんでした」というダイアログが表示されます。インストールは失敗します。これは最適ではありません。

戻りコードを取得して処理するにはどうすればよいですか?

4

3 に答える 3

5

Windows インストーラーは、カスタム アクションの戻り値の処理をサポートしていません。

EXE カスタム アクションの場合、ゼロ以外の戻り値はエラーとして解釈され、インストールが停止します。win32 DLL または VBScript カスタム アクションのみがリターン コードを通じてインストール動作を変更できますが、それでも非常に制限されています。

インストール後にマシンを再起動する場合は、 REBOOTプロパティを設定できます。

于 2012-04-20T04:28:37.527 に答える
3

リクエストにより「回答」として追加されました:

設計全体が最適ではありません。これは Windows インストーラーの処理外であり、宣言的ではありません。ドライバーをインストールするためのより良いパターンがあります。

これは、MSI が EXE 呼び出しを処理する方法です。独自のカスタム アクションを作成して EXE 呼び出しをラップし、失敗の理由を解釈する必要があります。私にとって、これはさらに別の障害点を追加するだけです。

于 2014-04-18T22:08:05.897 に答える
2

CustomAction からリターン コードを取得することはできませんが、ラウンド アバウトな方法で、そのリターン コードをプロパティに設定することができます。それは、戻りコードを取得することと同じことかもしれません。

カスタム アクションが実行している script/dll 内で取得する必要があります。それ以外の場合、戻りコードはログにのみ表示されます。

たとえば、次のようなプロパティがある場合

<Property="MyCode" Secure="yes">

次に、VBScript (または Jscript) 内で、次のようにそのプロパティの値を取得できます。

VBScript

Session.Property("MyCode")

最初は null です。次のように VBScript で設定できます。

If someCondition = 4 Then
  Session.Property("MyCode") = "4" // For a return code of 4
End If

WiX .wxs ファイルに戻って、プロパティの値を見ると、4 になっています。CDATA タグで使用することもできます。

たとえば、MyCode が 4 に等しい場合にのみダイアログを生成します。

<Publish Dialog="SpawnDialog" ...><![CDATA[ MyCode = 4 ]]></Publish>
于 2015-11-19T19:55:10.503 に答える