大規模なアプリケーションのプラグインとして使用される Qt DLL に取り組んでいます。この DLL は、悲しいことに同じフォルダーにない他の DLL に依存しているため、現在の作業ディレクトリが正しく設定されている場合にのみ読み込まれます (大規模なアプリケーションがLoadLibrary
DLL を呼び出す前に設定します)。私はこの行動を制御できません。
このプラグインに単純な COM オブジェクトを追加するように依頼されましたが、現在の作業ディレクトリが正しく設定されていない限り、サードパーティのアプリケーションで DLL を登録または使用できないという問題がありますLoadLibrary
。依存関係がないため、プラグインは失敗します。明らかに、サードパーティのアプリが使用する現在の作業ディレクトリを制御することはできません。この段階では、依存関係を確実に見つけるために PATH を変更することはできません。
依存する DLL に使用しようとし/DELAYLOAD
ましたが、「データ シンボルのインポートが原因で foo.dll を遅延ロードできません...」というエラーで失敗します。繰り返しになりますが、これらの依存 DLL の使用方法を簡単に変更することはできません。
現在、唯一の解決策は、COM オブジェクトを他に依存しないスタンドアロンの DLL に移動することだと思いますが、解決策を見つけて COM オブジェクトをプラグイン DLL に残すというプレッシャーにさらされています。これがどのように可能かわかりませんので、他の誰かにアイデアがあるかどうか見てみようと思いました。システム全体のSetDllDirectory
呼び出しの何らかの形式が役立つか、サードパーティのアプリがLoadLibrary
プラグインを呼び出したときに作業ディレクトリを設定できるレジストリ ハックが役立ちます。