2010-11-18 13 views
1

大規模なアプリケーションのプラグインとして使用されるQt DLLを作成しています。このDLLは、悲しいことに同じフォルダにある他のDLLに依存しているため、現在の作業ディレクトリが正しく設定されている場合にのみロードされます(大きなアプリケーションがDLLのLoadLibraryを呼び出す前に行います)。私はこの動作を制御できません。COMオブジェクトのDLL読み込みの問題

私はこのプラグインに単純なCOMオブジェクトを追加するように求められましたが、現在の作業ディレクトリが正しく設定されていない限り、DLLをサードパーティアプリケーションで登録または使用できないという問題があります。依存関係がないためにLoadLibraryプラグインの呼び出しが失敗するためです。明らかに、サードパーティのアプリケーションで使用されている現在の作業ディレクトリを制御することはできません。この段階では依存関係が見つかるようにPATHを変更することはできません。

私は/DELAYLOADを従属DLLに使用しようとしましたが、これは 'データシンボルのインポートによりfoo.dllを遅延ロードできません'というエラーで失敗します。ここでも、これらの依存DLLの使用方法を簡単に変更することはできません。

私は唯一の解決策は、COMオブジェクトを何にも依存しないスタンドアロンDLLに移動することですが、ソリューションを見つけてプラグインDLLにCOMオブジェクトを残すというプレッシャーを受けています。私はこれがどのように可能であるかを見ることができないので、誰か他のアイデアがあるかどうか分かりました。サードパーティのアプリケーションがLoadLibraryを私のプラグインに呼び出すと、システム全体のSetDllDirectoryコールの一部のフォームが役立ちます。

答えて

1

IMOはCOMオブジェクトを別の.dllに分けるのが最もクリーンな解決策です。誰もがin-proc COMサーバーがregsvr32を使用して登録され、そのCOMサーバーにファンシー依存性は必要ないと予想します。

+0

FWIW私は完全に同意します。私は、このアイデアを持つ力に売る必要があります。 – Rob

+0

@Rob:現在のデザインが苦痛を感じているのは力を見ていないのですか? – sharptooth

0

問題の解決策であるかどうかは分かりませんが、マニフェストファイルが提供する可能性を見てみてください。私はそれが助けてくれることを願う

0

ランタイム登録モデルを使用できます。 Dllは、自身の初期化コードでCOMサーバーとして自身を登録できます。

これは、dllがCOMサーバーとして使用される前にloadlibraryが呼び出されることが保証されている必要があります。