读书人

分享一个隐式链接加载随便目录中的DLL

发布时间: 2012-09-16 17:33:17 作者: rapoo

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

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

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

直接上代码:

CDLoader.h代

#include <vector>//CDLoader.h#pragma onceclass CDLoader{public:CDLoader(void){}virtual ~CDLoader(void){OnFreeLib();}bool AddDll(LPCTSTR pszDllFileName){HMODULE hModule=::LoadLibrary(pszDllFileName);if(hModule==NULL)return false;m_Modeules.push_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运行库),在程序一启动时就自动加载了,所以不适合这种方法。

2楼cadinfo昨天 18:25
m_Modeules.pop_back(hModule); n没看懂这行代码,是否应该是push_back呢?
1楼zhouzhipen昨天 06:25
[quote=cadinfo]m_Modeules.pop_back(hModule); n没看懂这行代码,是否应该是push_b...[/quote]n还是你眼尖,我写错了,笔误!哈哈。
Re: cadinfo昨天 08:42
难得糊涂是种美德回复zhouzhipen

读书人网 >编程

热点推荐