4

依存関係のないカスタム コマンドを問題なく実現できました。

ただし、ここでは、動作するために他の 4 つの dll とリンクする必要があるカスタム コマンドです。

<Binary Id="libeay32"          SourceFile="..\bin\libeay32.dll"/>
<Binary Id="libintl"           SourceFile="..\bin\libintl.dll"/>
<Binary Id="libpq"             SourceFile="..\bin\libpq.dll"/>
<Binary Id="ssleay32"          SourceFile="..\bin\ssleay32.dll"/>
<Binary Id="custom"            SourceFile="..\bin\custom_cmd.dll"/>

  <CustomAction Id="cc_postgres" BinaryKey="custom" DllEntry="on_postgres_cmd" Execute="immediate" Return="check" HideTarget="no" />

インストール時に次のエラーが発生しました

エラー 1723。この Windows インストーラー パッケージには問題があります。このインストールを完了するために必要な DLL を実行できませんでした。サポート担当者またはパッケージ ベンダーにお問い合わせください。アクション cc_postgres、エントリ: on_postgres_cmd、ライブラリ: C:\Users\THE\AppData\Local\Temp\MSI17BB.tmp

すべてを静的に再コンパイルせずに、Wix でこのスポットを実行する方法。

どうも。

4

1 に答える 1

4

MSI はこれらのサービスを提供しておらず、WiX はそのための拡張機能を提供していません。この目的のために WiX 拡張機能を作成することもできると思いますが、なぜでしょうか?

MSI は、最初にバイナリリソースのコピーを一時ディレクトリに抽出し、次にそのコピーのエントリ ポイントを呼び出し、(カスタム アクションの完了時に) 一時 DLL コピーを解放することによって、タイプ 1 カスタム アクションを実行します。(そうでない場合: MSI は、後で他のエントリ ポイントを呼び出す場合の最適化として、そのコピーをしばらく保持することを決定する場合があります。ただし、それはコードではなく MSI 次第です。)

重要な点は、バイナリリソースが一時的に自動ロードされることです...そして1 つのリソースのみです。つまり、必要な他のリソースをロードするのはカスタム アクション次第です。

カスタム アクションは、最初のステップとして、Binaryテーブルのビューを開き、適切なレコードからData列をストリームとして読み取り、そのデータ バッファーをどこかのファイルにダンプしてから、明示的に実行する必要があります::LoadLibrary()。次に::GetProcAddress()、関数で、カスタム アクションがそのロードされたライブラリから呼び出し、フェッチされたポインターを使用して明示的な呼び出しを行います。最後に、あなたは礼儀正しいプログラマであるため、カスタム アクションが完了したら、戻る前にこのインフラストラクチャをすべて破棄する必要があります。ビューとライブラリ ハンドルを解放し、一時ファイルを削除するなどです。

これらすべてが非常に面倒に思えたとしても、その通りです。custom_cmd.dll非常に単純な解決策は、まさに拒否するものです。静的にリンクします。はい、これにより、バイナリとそれを含む.msiが少し大きくなります (依存する DLL の個別のバイナリコピーが不要になるため、それほど大きくはなりません)。しかし、それはほとんど唯一の欠点です。利点は、カスタム アクションには、ジョブを完了するために必要なすべてのものが含まれていることです。

カスタム アクションだけでなく、ブートストラップなど、明示的な外部依存関係がない場合でも、インストール時に実行されるすべてのバイナリに対して、定期的に静的リンクを作成します。(ただし、もちろん、Visual C++ ランタイム ライブラリなどの暗黙的なものもあります。) そうすれば、必要なリソースがあることだけでなく、それらのリソースの正しいバージョンであることもわかり、顧客が発生した可能性のあるバージョンはわかりません。以前にインストールする...またはまったくインストールしていません。

あなたのインストール パッケージは、自分の環境を前もって知らないスカウトです。それはアメリカの大都市かもしれません…それとも月かもしれません。またはBarsoom。携帯電話サービスや酸素があると思い込まないでください。あなたとそれを運ぶ!

于 2013-03-05T00:21:13.383 に答える