dll隐式链接延迟加载

 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 }

 

posted on 2017-10-11 12:21  炽离  阅读(899)  评论(0编辑  收藏  举报

导航