分享一个隐式链接加载任意目录中的DLL方法

zhouzhipen 2012-08-28 06:25:43
加精
因为Windows中,隐式链接的DLL,加载方式由系统控制,DLL只能放在固定的目录中,才能被exe加载。最近做的一个项目中,由于有近100个不同功能的DLL,如果统一存放在exe目录下,不便于管理。



以下分享如何使Windows按照自己的方式加载DLL。

直接上代码:

CDLoader.h代

#include <vector>

class CDLoader
{
public:
CDLoader(void){}
virtual ~CDLoader(void){OnFreeLib();}
bool AddDll(LPCTSTR pszDllFileName)
{
HMODULE hModule=::LoadLibrary(pszDllFileName);
if(hModule==NULL)
return false;
m_Modeules.pop_back(hModule);
return true;
}
protected:
void OnFreeLib()
{
for (int i=0;i<m_Modeules.size();++i)
::FreeLibrary(m_Modeules[i]);
m_Modeules.clear();
}
private:
vector<HMODULE> m_Modeules;
}

在主程序中include CDLoader.h,然后在程序初始化的地方加入以下代码:


static CDLoader dl;
dl.AddDll("你的DLL1路径");
dl.AddDll("你的DLL2路径");
...
dl.AddDll("你的DLLn路径");


然后将编译选项中的DLL加载方式设置为“延迟加载”。

OK,大功告成!



原理:

因为Windows不会重复加载相同名字的DLL,当Windows系统需要加载DLL时,发现该DLL已经被你加载过了,只是增加一个引用计数,然后直接使用已加载的DLL。

当然这种方法也不是万能的,由于以上原理,需要加载的DLL只能在系统加载之前,自己先加载,然而,一些关键的DLL(如VC运行库),在程序一启动时就自动加载了,所以不适合这种方法。

...全文
6511 87 打赏 收藏 转发到动态 举报
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
vincent_1011 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 86 楼 的回复:]

引用 81 楼 的回复:

引用 75 楼 的回复:

你这个是显式链接,哪是隐式呀


我也不知道是我SB还是这帖子的人都SB,竟然都认为这个是隐匿链接?
难道CSDN这么多SB?


好久没来了,想不到有这么多人关注,尤其这位仁兄,不要以为别人都是“SB”只有就你能看出来问题。这种方法的好处就是:你不用显式获取函数指针,而由编译器自动隐式链接到需要使用的函数。如果您……
[/Quote]

好吧,我只是觉得标题不合适。你设置成延时加载确实能解决那个问题。
zhouzhipen 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 的回复:]

引用 75 楼 的回复:

你这个是显式链接,哪是隐式呀


我也不知道是我SB还是这帖子的人都SB,竟然都认为这个是隐匿链接?
难道CSDN这么多SB?
[/Quote]

好久没来了,想不到有这么多人关注,尤其这位仁兄,不要以为别人都是“SB”只有就你能看出来问题。这种方法的好处就是:你不用显式获取函数指针,而由编译器自动隐式链接到需要使用的函数。如果您不能明白所说好处,则说明还没有使用过DLL。
asdfind 2012-09-13
  • 打赏
  • 举报
回复
没什么用处
nscboy 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 的回复:]

修改程序的env就行了
[/Quote]
就是这个方法了.绝对好用啊.
富莱工作室 2012-09-12
  • 打赏
  • 举报
回复
看不出, 这么做有什么用, 有什么意义,
这也不是什么隐式加载
vincent_1011 2012-09-07
  • 打赏
  • 举报
回复
[Quote=引用 75 楼 的回复:]

你这个是显式链接,哪是隐式呀
[/Quote]

我也不知道是我SB还是这帖子的人都SB,竟然都认为这个是隐匿链接?
难道CSDN这么多SB?
guagecool 2012-09-06
  • 打赏
  • 举报
回复
http://www.cnblogs.com/FCoding/archive/2012/08/15/2640989.html 这个可以胜任,支持相对路径,和绝对路径
hnckjckj 2012-09-05
  • 打赏
  • 举报
回复
多谢楼主分享!
a2325145 2012-09-05
  • 打赏
  • 举报
回复
不错不错 收藏了 嘿嘿
the_venus 2012-09-04
  • 打赏
  • 举报
回复
你这个是显式链接,哪是隐式呀
NewHeShe 2012-09-04
  • 打赏
  • 举报
回复
我尚未领会是否有更深刻意义在里面。

[Quote=引用 44 楼 的回复:]

就是稍微重构了下LoadLibrary和FreeLibrary?
[/Quote]
东莞某某某 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 的回复:]
跟我思路一样.load dll.自己指定目录.而已.比静态连接.还麻烦.一个一个加dll.写代码
不如统统dll丢进一个目录.hook loadlibray加载,参数改dll路径,一劳永逸..比如某些病毒技术.
[/Quote]

思路不错哦。

用过使用xml配置文件的方法来Load大量DLL
知遇_漫天星 2012-09-03
  • 打赏
  • 举报
回复
修改程序的env就行了
hg2980986 2012-09-03
  • 打赏
  • 举报
回复
kbh1984 2012-09-03
  • 打赏
  • 举报
回复
100个dll这样加啊?还不如改下系统的PATH变量呢。
clever101 2012-09-03
  • 打赏
  • 举报
回复
延迟加载表示什么意思?
满衣兄 2012-09-03
  • 打赏
  • 举报
回复
不错,收藏了
僵哥 2012-09-03
  • 打赏
  • 举报
回复
对于延迟加载,可以考虑使用AddDllDirectory添加,不过前提条件是要求LoadLibraryEx带了参数LOAD_LIBRARY_SEARCH_USER_DIRS,且此之前添加路径。
jiangbo615 2012-09-03
  • 打赏
  • 举报
回复
真心不错,收 了
chilli6519 2012-09-02
  • 打赏
  • 举报
回复
100多个DLL,不可思议
加载更多回复(47)

15,471

社区成员

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

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