zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    ActiveSync合作关系对话框的配置
    WINCE对象存储区(object store)
    Wince 隐藏TASKBAR的方法
    Wince输入法换肤换语言机制
    poj 3080 Blue Jeans 解题报告
    codeforces A. Vasily the Bear and Triangle 解题报告
    hdu 1050 Moving Tables 解题报告
    hdu 1113 Word Amalgamation 解题报告
    codeforces A. IQ Test 解题报告
    poj 1007 DNA Sorting 解题报告
  • 原文地址:https://www.cnblogs.com/hgwang/p/7649964.html
Copyright © 2011-2022 走看看