分享一个隐式链接加载任意目录中的DLL方法,该如何解决
分享一个隐式链接加载任意目录中的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运行库),在程序一启动时就自动加载了,所以不适合这种方法。
------解决方案--------------------
不错 呵呵
------解决方案--------------------
XP是不是不支持延迟加载?
我曾经做过测试,vs2008 + XP,选上延迟加载,又选了另外一个选项,忘记了
最后在dllmain中发现,并没有延迟加载
同样的问题也出现在随机化基址上
------解决方案--------------------
这个真不错,赞一个。
------解决方案--------------------
------解决方案--------------------
还有一个方法
延迟加载
然后
因为Windows中,隐式链接的DLL,加载方式由系统控制,DLL只能放在固定的目录中,才能被exe加载。最近做的一个项目中,由于有近100个不同功能的DLL,如果统一存放在exe目录下,不便于管理。
以下分享如何使Windows按照自己的方式加载DLL。
直接上代码:
CDLoader.h代
- C/C++ code
#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,然后在程序初始化的地方加入以下代码:
- C/C++ code
static CDLoader dl; dl.AddDll("你的DLL1路径"); dl.AddDll("你的DLL2路径"); ... dl.AddDll("你的DLLn路径");
然后将编译选项中的DLL加载方式设置为“延迟加载”。
OK,大功告成!
原理:
因为Windows不会重复加载相同名字的DLL,当Windows系统需要加载DLL时,发现该DLL已经被你加载过了,只是增加一个引用计数,然后直接使用已加载的DLL。
当然这种方法也不是万能的,由于以上原理,需要加载的DLL只能在系统加载之前,自己先加载,然而,一些关键的DLL(如VC运行库),在程序一启动时就自动加载了,所以不适合这种方法。
------解决方案--------------------
不错 呵呵
------解决方案--------------------
XP是不是不支持延迟加载?
我曾经做过测试,vs2008 + XP,选上延迟加载,又选了另外一个选项,忘记了
最后在dllmain中发现,并没有延迟加载
同样的问题也出现在随机化基址上
------解决方案--------------------
这个真不错,赞一个。
------解决方案--------------------
------解决方案--------------------
还有一个方法
延迟加载
然后
- C/C++ code
BOOL WINAPI SetDllDirectory( __in_opt LPCTSTR lpPathName );
------解决方案--------------------
没这么用过,学习~~
------解决方案--------------------