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 }
  • 相关阅读:
    《数据结构》张明瑞 清华大学 计算机科学与技术专业 大二
    Android studio 快捷键
    android下的样式
    Android照片墙应用实现,再多的图片也不怕崩溃
    菜单
    Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
    自动文本提示控件
    Android高效加载大图、多图解决方案,有效避免程序OOM
    notification+service实现消息推送
    常见对话框
  • 原文地址:https://www.cnblogs.com/hgwang/p/7649964.html
Copyright © 2011-2022 走看看