dll隐式链接延迟加载
2017-10-11 12:21
239 查看
dll隐式链接延迟加载
程序隐式链接dll后,启动程序将自动加载dll,查找路径依次是:1:当前文件路径;
2:使用SetDLLDirectory设置的路径;
3:系统路径,system32文件夹,可使用GetSystemDirectory函数查看;
4:windows路径,可使用GetWindowsDirectory函数查看;
5:设置的系统路径;
用Depends查看exe依赖项,非延迟加载的exe如下图所示:
非延迟加载的exe打开后会按照上诉路径去查找dll,找不到dll会报错。导致打开程序失败。
某些情况下,exe需要依赖子目录或其他目录的dll,就要用到延迟加载。
首先,在vs编译选项linker->input->Delay Loaded Dlls内写入需要延迟加载的隐式链接dll。
然后,在程序用到dll之前用loadlibrary将dll加载。或者使用SetDllDirectory将dll路径包含,值得注意,SetDllDirectory仅适用于XP Sp1以上的版本,如下图所示。
延迟加载的exe如下图所示:
设置延迟加载后,Depends依赖的dll前面会有沙漏形状。
这里推荐一篇blog“隐式链接加载任意目录中的DLL方法”,http://bbs.csdn.net/topics/390192409,里面的类挺好用,适用于多个dll不在一个目录的情况。
1 #include <vector> 2 3 class CDLoader 4 { 5 public: 6 CDLoader(void){} 7 virtual ~CDLoader(void){OnFreeLib();} 8 bool AddDll(LPCTSTR pszDllFileName) 9 { 10 HMODULE hModule=::LoadLibrary(pszDllFileName); 11 if(hModule==NULL) 12 return false; 13 m_Modeules.pop_back(hModule); 14 return true; 15 } 16 protected: 17 void OnFreeLib() 18 { 19 for (int i=0;i<m_Modeules.size();++i) 20 ::FreeLibrary(m_Modeules[i]); 21 m_Modeules.clear(); 22 } 23 private: 24 vector<HMODULE> m_Modeules; 25 }
相关文章推荐
- 分享一个隐式链接加载任意目录中的DLL方法
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- 动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)
- dll的加载方式主要分为两大类,显式和隐式链接
- 使用延迟加载DLL来加载指定目录下的DLL
- 延迟加载Dll的实现原理
- (一)Dll 动态链接 的 隐式调用(VS2010)
- 关于VS的延迟加载dll的使用和理解
- vc++ 隐式链接dll
- 延迟加载DLL 的意义
- OD修改加载外部DLL动态链接库运行
- C++对dll链接库的显示(动态)调用和隐式(静态)调用
- 请问dll中的隐式链接和显式链接的区别?谢谢,初学VC,多多帮助,在线等
- 延迟加载Dll的实现原理
- 动态链接库(dll) - 隐式加载(载入时加载)和显式加载(运行时加载)
- dll的隐式链接
- 延迟加载DLL
- 延迟加载DLL
- Dll学习(三)--隐式链接(例子)