分享一个隐式链接加载任意目录中的DLL方法 本帖最后由 zhouzhipen 于 2012-08-28 18:29:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 XP是不是不支持延迟加载?我曾经做过测试,vs2008 + XP,选上延迟加载,又选了另外一个选项,忘记了最后在dllmain中发现,并没有延迟加载同样的问题也出现在随机化基址上 还有一个方法延迟加载然后BOOL WINAPI SetDllDirectory( __in_opt LPCTSTR lpPathName); 感谢cadinfo 指出一处书写错误:m_Modeules.pop_back(hModule);改为m_Modeules.push_back(hModule); 这种方法,好像只能增一个目录中吧,如果多个目录中有DLL就没办法了。 将DLL放到不同目录后,CRT运行库的问题怎么解决的?直接安装的CRT发布包?还是在每个目录下拷贝一份CRT的文件? lz不是说了么,一些关键的dll不适应这个方法~~~ 你没懂我的意思吧,CRT直接放到exe主目录下,DLL目录下的DLL是找不到CRT的哦 不会的,CRT的DLL在exe启动时已经被加载了,DLL是不会再加载的。 我用的是 VS2008 编译器,按照你的方法加载的DLL,但是 LoadLibrary 在加载分目录下的DLL时直接失败,GetLastError 返回 14001(应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具。)。然后我把运行库拷到该分目录下,运行就正常了!你用的是不是干净的系统呀,我用的干净的虚拟机的 难道你的exe不需要加载CRT?或者EXE与DLL不是同一版本的编译器编译的? VS2008的话需要 对应版本的dll以及 manifest 。 这个我喜欢哈哈哈哈!只需要改调用者程序为延迟加载? DLL不用了把? 本身设计就有问题 非要搞个不正常的规则来加载dll,只会带来更多麻烦,维护也困难。设计应该尽量简单。 就是稍微重构了下LoadLibrary和FreeLibrary? 搞不懂意义何在。把所有的dll都事先统一注册,那又如何。更何况动态加载的意义就是需要时才加载。你这样做了,其实就等于静态加载。 跟我思路一样.load dll.自己指定目录.而已.比静态连接.还麻烦.一个一个加dll.写代码不如统统dll丢进一个目录.hook loadlibray加载,参数改dll路径,一劳永逸..比如某些病毒技术. 延时加载不是操作系统提供的功能,是编译器的支持。这里有篇较老的文章:http://www.microsoft.com/msj/1298/hood/hood1298.aspx楼主的作法可以实现功能,但是违背了delay load的真正作用。楼主的功能不用这么麻烦,编译器为了支持delay load,提供了专门的头文件来方便开发同学对delay load 的hook功能。具体见DELAYIMP.H 100个dll这样加啊?还不如改下系统的PATH变量呢。 对于延迟加载,可以考虑使用AddDllDirectory添加,不过前提条件是要求LoadLibraryEx带了参数LOAD_LIBRARY_SEARCH_USER_DIRS,且此之前添加路径。 思路不错哦。用过使用xml配置文件的方法来Load大量DLL http://www.cnblogs.com/FCoding/archive/2012/08/15/2640989.html 这个可以胜任,支持相对路径,和绝对路径 我也不知道是我SB还是这帖子的人都SB,竟然都认为这个是隐匿链接?难道CSDN这么多SB? 好久没来了,想不到有这么多人关注,尤其这位仁兄,不要以为别人都是“SB”只有就你能看出来问题。这种方法的好处就是:你不用显式获取函数指针,而由编译器自动隐式链接到需要使用的函数。如果您不能明白所说好处,则说明还没有使用过DLL。 怎样实现在任务隐藏窗口,但可以根据窗口的状态控制在Alt-Tab时是否可见 位图加载不成功 如何在windows中用程序实现快速复制文件 请问:使用ras的vpn连接是否是基于ipsec的vpn? 图像输出问题 结构定义的问题 请问:为什么给IE发WM_CLOSE消息,没有反应 大三课程设计:编一个电力系统仿真的程序!有经验给的经验,没经验给方法,没方法捧个场! 如何用vc实现向网站自动发布信息 在线等待。。。。。。。 Internet文件传输 一排普通按钮,如何才能知道哪一个按钮被点击过 关于制作安装的问题?
我曾经做过测试,vs2008 + XP,选上延迟加载,又选了另外一个选项,忘记了
最后在dllmain中发现,并没有延迟加载同样的问题也出现在随机化基址上
延迟加载
然后
BOOL WINAPI SetDllDirectory(
__in_opt LPCTSTR lpPathName
);
m_Modeules.pop_back(hModule);
改为
m_Modeules.push_back(hModule);
这种方法,好像只能增一个目录中吧,如果多个目录中有DLL就没办法了。
直接安装的CRT发布包?还是在每个目录下拷贝一份CRT的文件?
不会的,CRT的DLL在exe启动时已经被加载了,DLL是不会再加载的。
然后我把运行库拷到该分目录下,运行就正常了!
你用的是不是干净的系统呀,我用的干净的虚拟机的
只需要改调用者程序为延迟加载? DLL不用了把?
跟我思路一样.load dll.自己指定目录.而已.比静态连接.还麻烦.一个一个加dll.写代码
不如统统dll丢进一个目录.hook loadlibray加载,参数改dll路径,一劳永逸..比如某些病毒技术.
这里有篇较老的文章:http://www.microsoft.com/msj/1298/hood/hood1298.aspx楼主的作法可以实现功能,但是违背了delay load的真正作用。楼主的功能不用这么麻烦,编译器为了支持delay load,提供了专门的头文件来方便开发同学对delay load 的hook功能。
具体见DELAYIMP.H
思路不错哦。用过使用xml配置文件的方法来Load大量DLL
我也不知道是我SB还是这帖子的人都SB,竟然都认为这个是隐匿链接?
难道CSDN这么多SB?
好久没来了,想不到有这么多人关注,尤其这位仁兄,不要以为别人都是“SB”只有就你能看出来问题。这种方法的好处就是:你不用显式获取函数指针,而由编译器自动隐式链接到需要使用的函数。如果您不能明白所说好处,则说明还没有使用过DLL。