分享一个隐式链接加载任意目录中的DLL方法
因为Windows中,隐式链接的DLL,加载方式由系统控制,DLL只能放在固定的目录中,才能被exe加载。最近做的一个项目中,由于有近100个不同功能的DLL,如果统一存放在exe目录下,不便于管理。
以下分享如何使Windows按照自己的方式加载DLL。
直接上代码:
CDLoader.h代
在主程序中include CDLoader.h,然后在程序初始化的地方加入以下代码:
然后将编译选项中的DLL加载方式设置为“延迟加载”。
OK,大功告成!
原理:
因为Windows不会重复加载相同名字的DLL,当Windows系统需要加载DLL时,发现该DLL已经被你加载过了,只是增加一个引用计数,然后直接使用已加载的DLL。
当然这种方法也不是万能的,由于以上原理,需要加载的DLL只能在系统加载之前,自己先加载,然而,一些关键的DLL(如VC运行库),在程序一启动时就自动加载了,所以不适合这种方法。
以下分享如何使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运行库),在程序一启动时就自动加载了,所以不适合这种方法。
...全文
相关推荐
改变隐式加载dll路径的方法实例代码
通过SetDllDirectory可以灵活的设置隐式加载dll的路径,详见源代码.vs2005编译
【C++动态库】DLL动态库加载失败导致程序启动报错以及DLL库加载失败的常见原因分析与总结
本文讲述dll动态库加载失败导致程序启动报错问题,以及dll库加载失败的常见原因分析与总结。
QT中DLL显示加载和隐式加载的Demo
自己学习QT中DLL显示加载和隐式加载的Demo,相关文章链接:https://www.jianshu.com/p/2851c0f7f4a9
C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用
C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用
DLL动态链接库生成和使用(隐式调用、显示调用)
Windows10 64位系统,VS2013 编程平台。两个工程,工程一为生成DLL的方法,生成dll、lib文件;工程二为调用DLL的方法,分为隐式调用和显式调用。两个工程都是控制台应用程序consoleapplication。 对应的文章为 https://blog.csdn.net/u012210613/article/details/88904841


进程/线程/DLL
