考虑 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")。这将失败,因为 Windows 将无法找到 helper.dll,这与文档中的 DLL 搜索过程一致。
- app.exe 调用 CoCreateInstance 以创建在 com_server.dll 中实现的对象。这成功并加载了 helper.dll。
主要问题:为什么案例 2 有效?COM 服务器案例的依赖 DLL 搜索过程的细节是什么?
看起来,当使用 CoCreateInstance 创建 com 对象时,实现 dll 的文件夹以某种方式添加到依赖项的搜索路径中。这是正在发生的事情吗,这是有保证的吗?我在任何地方都找不到任何讨论此案例的文档。