关于动态库加载的一些疑问

春天到了冬天还远吗 2015-07-26 02:50:48
a.exe动态加载了B.dll,B.dll 又静态加载了C.dll
假如B.dll 跟a.exe不在同一个目录,此时如果c.dll跟b.dll在同一个目录,a.exe loadlibrary("B.dll") 会失败,只有c.dll跟a.exe在同一个目录时才会加载成功
也就是,当动态加载某个动态库时,不会在该动态库目录下搜索该动态库静态加载的其他动态库

问题来了 CoCreateInstance这个api是创建com组件的,他肯定要加载com组件对应的dll的,此时这个dll如果静态加载了其他动态库,那CoCreateInstance又是怎么加载对应的动态库的,不可能是保存当前目录,然后更改当前目录到dll所在的目录下,等加载成功后,又把当前目录改回去。

好像用od ida可以瞧CoCreateInstance是怎么实现,懒得去弄了。。。
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2015-07-27
  • 打赏
  • 举报
回复
看看 LoadLibrary 中关于路径的要求你就知道了。 可以设置这个路径的。 COM 组件也是一样的。 只是他们都是放在系统的路径下面的。
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
lz是没写过能CoCreateInstance的COM组件吧, 写完要注册的, dll要导出几个函数DllGetClassObject啥的,一旦注完册, 注册表里面就有路径信息, 这个dll路径就不能改了, 改了就找不到了需要重新注册。 还有就是没有所谓的“静态加载的动态库”, 要么是显式的,要么是隐式的
我说的 静态加载 就是你说的 隐示加载 我说的动态加载就是你说的显示 假如有个com对应的动态哭为 c:\aa\aa.dll(已注册) 他静态(隐式)加载了动态库 c:\aa\b.dll 你的exe在d:\ 你CoCreateInstance 时能成功,但 你自己显示加载c:\aa\aa.dll却会失败 。我的问题是为什么CoCreateInstance 能显示加载 c:\aa\aa.dll成功
dustpg 2015-07-26
  • 打赏
  • 举报
回复
lz是没写过能CoCreateInstance的COM组件吧, 写完要注册的, dll要导出几个函数DllGetClassObject啥的,一旦注完册, 注册表里面就有路径信息, 这个dll路径就不能改了, 改了就找不到了需要重新注册。 还有就是没有所谓的“静态加载的动态库”, 要么是显式的,要么是隐式的

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧