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

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

 

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

直接上代码:

CDLoader.h代

#include <vector>
//CDLoader.h
#pragma once

class 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运行库),在程序一启动时就自动加载了,所以不适合这种方法。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值