1

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

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

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

現在、唯一の解決策は、COM オブジェクトを他に依存しないスタンドアロンの DLL に移動することだと思いますが、解決策を見つけて COM オブジェクトをプラグイン DLL に残すというプレッシャーにさらされています。これがどのように可能かわかりませんので、他の誰かにアイデアがあるかどうか見てみようと思いました。システム全体のSetDllDirectory呼び出しの何らかの形式が役立つか、サードパーティのアプリがLoadLibraryプラグインを呼び出したときに作業ディレクトリを設定できるレジストリ ハックが役立ちます。

4

3 に答える 3

1

COM オブジェクトを個別の .dll に分離する IMO は、最もクリーンなソリューションです。誰もが、インプロセス COM サーバーを使用して登録することを期待し、regsvr32その COM サーバーに特別な依存関係を必要としません。

于 2010-11-18T09:34:15.447 に答える
0

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

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

于 2010-11-18T10:10:34.730 に答える
0

それがあなたの問題に対する正確な解決策であるかどうかはわかりませんが、これが役立つかもしれません: マニフェスト ファイルが提供する可能性を調べてみてください。それが役立つことを願っています。

于 2010-11-18T09:46:49.923 に答える