私たちのプログラムは、同じく私たちが作成した COM サーバーを使用する必要があります。シナリオは次のとおりです。インストーラーは、プログラム ファイルと COM サーバー ファイルの両方を、インストールごとに同じフォルダーにコピーします。
現在、regsvr32 を使用して COM サーバーを登録していますが、これはあまり良くありません。同じ COM サーバー (別のバージョンの可能性が高い) を使用する別の無関係なプログラムを開発すると、問題が発生する可能性があります。CLSID が変更されていないため、サーバーは後で登録されたプログラムは両方のプログラムで使用され、最初のプログラムが誤動作する可能性があります。
したがって、reg-free COM が必要です。マニフェストを使用することもできますが、しばらく使ってみたところ、ナイトリー ビルドで使用するにはあまり便利ではありませんでした。プログラムを書き換えて、 を呼び出す代わりに を呼び出しCoCreateInstance()
てから、クラス ファクトリを見つけて取得し、それLoadLibraryEx()
を使用するようにすることもできます。GetProcAddress()
DllGetClassObject()
いくつかの欠点がすぐにわかります。
- プログラムは、正確な COM サーバー ファイル名に依存します。
- 通常は Windows で管理されるものについては、追加のコードを記述する必要があります。
- COM サーバーはインプロセスである必要があり、マーシャリングは使用されません。
これらの欠点は、一般的にショー ストッパーになる可能性がありますが、特定のシナリオではまったく悪くはありません。
と比較してLoadLibraryEx()
/を使用することで他に欠点はありますか?DllGetClassObject()
CoCreateInstance()