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 }