Windows では、次のファイル編成を検討してください。
[app folder]
app.exe
[folder 'sub']
com_server.dll
regular.dll
helper.dll
また、次のことを前提とします。
- com_server.dll と regular.dll は両方とも、helper.dll 内の関数に静的にリンクされているため、helper.dll はそのときに読み込まれます。
- app.exe には静的な依存関係はありません。
- com_server.dll COM オブジェクトが Windows に登録されている
- フォルダ 'sub' がシステム パスにありません。
次のケースを考慮してください。
- app.exe は LoadLibrary( "sub/regular.dll" ) を呼び出します。ドキュメントに記載されている DLL 検索手順と一致して、Windows が helper.dll を見つけることができないため、これは失敗します。
- app.exe は CoCreateInstance を呼び出して、com_server.dll に実装されたオブジェクトを作成します。これは成功し、helper.dll がロードされます。
主な質問: ケース 2 が機能するのはなぜですか? COM サーバーの場合の依存 DLL 検索手順の詳細は?
CoCreateInstance で com オブジェクトを作成すると、実装している dll のフォルダーが何らかの形で依存関係の検索パスに追加されているように見えます。これは起こっていることであり、これは保証されていますか? このケースについて説明しているドキュメントはどこにも見つかりません。