ホームページ >バックエンド開発 >C++ >Wix MSI インストーラーを使用して CPP DLL を COM に適切に登録するにはどうすればよいですか?

Wix MSI インストーラーを使用して CPP DLL を COM に適切に登録するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-19 03:00:03580ブラウズ

How to Properly Register a CPP DLL into COM Using Wix MSI Installer?

Wix Msi インストーラーを使用したインストール後に CPP dll を COM に登録する

短い要約回答

停止する必要がありますCOM 登録にはバッチ ファイルとカスタム アクションを使用し (信頼性が低い)、代わりに WiX ツールキットの heat.exe ツールを使用して COM 登録情報を抽出し、コンパイル時に COM 登録を MSI データベースに追加します。

64 ビット バイナリにはいくつかの複雑な問題があります。詳細は以下を参照してください。幸いなことに、上記のインストール ディレクトリに基づいて 32 ビット コンポーネントを扱っているようです。

この特定のケースでは、すべての依存関係が " place」を実行すると、COM ファイルが適切にロードされます。これらの回答には「デバッグ通信」がたくさんあります。将来のためにすべてそのままにしておきますが、最初にこの簡単な解決策を試してください。そしておそらく、以下で説明する新しい依存関係ツール「Dependency.exe」を試してみてください。

長く詳細な回答

質問に答える前に (この質問は依存関係が欠落しているか、バッチ ファイルで何か奇妙な処理が行われています)。COM 登録のベスト プラクティスに関していくつかの点を整理したいと思います。

自己登録は有害であると考えられています

COM ファイルの登録には自己登録を使用しないでください。これが当てはまる理由の説明は次のとおりです: [MSI 登録 dll - 自己登録は有害であると考えられます](https://stackoverflow.com/questions/2736641/com-registration-where-did-the-idea-of-no) -self-registration-come-from/2737548#2737548)。ただし、良いニュースがあります。適切に設定すると、組み込みの MSI メカニズムを介して意図したとおりに実行することがより簡単になり、信頼性も高くなります。

カスタム アクションや SelfReg テーブルを使用するのではなく、COM 登録情報コンパイル時、つまり WiX ソース ファイルから MSI ファイルをコンパイルするときに、COM ファイルから抽出する必要があります。抽出されたレジストリ データは、インストール中およびアンインストール中にそれぞれ COM ファイルを確実に登録および登録解除できるように設計された MSI データ テーブル ファミリにデータを取り込むために使用する必要があります。

WiX: 「heat.exe」コマンド ライン ツール

このプロセスの複雑な詳細を理解する必要はありません。知っておく必要があるのは、どのツールを使用するかだけです。 WiX は、この目的のために「heat.exe」ツールを提供します。これは本質的に、いくつかの目的で有効な WiX XML ソース ファイルを生成できる「ハーベスタ」ツールであり、そのうちの 1 つは COM 抽出です。また、一般的なディレクトリの走査もサポートしており、走査中に見つかったファイルをインストールできる WiX ソース ファイルを生成します。基本的に、使い方がわかれば MSI パッケージを非常に簡単に作成できます。

Dependency Walker

したがって、COM ファイルを適切に登録するために必要な WiX ソースを生成するために heat.exe を使用する方法を時間をかけて学ぶ必要があることがわかりました。ただし、依存関係が欠落しているというもう 1 つの問題があります。

COM ファイルを自己登録できるようにするため、または heat.exe を使用して COM レジストリ データを正常に抽出できるようにするには、COMファイルを正しくロードできる必要があります。これを可能にするには、すべての DLL 依存関係が、問題のシステム上のアクセス可能な場所で利用可能である必要があります。

Dependency Walker のコピーを入手し、それを使用して COM ファイルをスキャンして、どのファイルが依存しているかを調べます。 MMUtilities.dll が見つからないためにロードに失敗する COM ファイルの例を次に示します。

[欠落している依存関係を示す依存関係ウォーカーの出力の画像]

おそらく同様の間違いが見つかるでしょう。セットアップのインストール場所から実行される場合は、dll (または任意のファイル タイプ (OCX など)) を使用して実行します。必要な依存関係ファイルが regsvr32.exe で見つからず、登録プロセスが失敗します。

重要ではない欠落している依存関係がいくつか報告されています - これは古いことが関係していると思います依存関係ウォーカー ツールの - 私の知る限り、最近更新されていません。聞いたこともないファイルの非常に長い DLL 名ではなく、独自の依存関係ファイルまたはコア システム ファイルとして認識されるファイルを探してください。一部の DLL には、読み込みに必要な依存言語 DLL があることに注意してください。たとえば、MMUtilities.dll を正しくロードするには、MmUtilitiesEnglish.dll または同じフォルダーに存在する別の言語 DLL が必要です。

上記のファイルの誤検知依存関係のサンプル: API-MS -WIN-CORE-RTLSUPPORT-L1-1-0.DLL、API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL、API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL 、etc…たくさんありました。私は、これらの誤検知の根本原因は、

にインストールされた並列コンポーネントの問題に集中していると信じていますが、確信はありません。

以上がWix MSI インストーラーを使用して CPP DLL を COM に適切に登録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。