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不在一个目录的情况。

 #include <vector>

 class CDLoader
{
public:
CDLoader(void){}
virtual ~CDLoader(void){OnFreeLib();}
bool AddDll(LPCTSTR pszDllFileName)
{
HMODULE hModule=::LoadLibrary(pszDllFileName);
if(hModule==NULL)
return false;
m_Modeules.pop_back(hModule);
return true;
}
protected:
void OnFreeLib()
{
for (int i=;i<m_Modeules.size();++i)
::FreeLibrary(m_Modeules[i]);
m_Modeules.clear();
}
private:
vector<HMODULE> m_Modeules;
}

dll隐式链接延迟加载的更多相关文章

  1. DLL隐式链接

    动态链接库有2种连接方式,一种是通过库直接加入(又叫隐式加载或载入时加载),一种是在运行时加入.后者很好理解,比如LoadLibrary(),GetProcAddress()获取想要引入的函数,使用完 ...

  2. dll的加载方式主要分为两大类,显式和隐式链接

    之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...

  3. [转]静态库、动态库,dll文件、lib文件,隐式链接、显式链接

    转自:https://blog.csdn.net/dcrmg/article/details/53427181 静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方 ...

  4. 静态库、动态库,dll文件、lib文件,隐式链接、显式链接浅见

    静态链接.动态链接 静态库和动态库分别应用在静态链接方式和动态链接方式中,所谓静态链接方式是指在程序执行之前完成所有的链接工作,把静态库一起打包合入,生成一个可执行的目标文件(EXE文件).所谓动态链 ...

  5. VC 静态库与动态库(三)动态库创建与使用_隐式链接

    动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...

  6. C++ 调用C++写的类库的2种方法之一(隐式链接)

    一:创建C++ DLL类库,名称:Dll1 1.Dll1.h /*#ifndef Dll_API #else #define Dll_API _declspec(dllimport) #endif * ...

  7. Dll的显式和隐式调用

    建立项目,请选择Win32 控制台项目(Win32 Console Application),选择DLL和空项目选项.DLLs可能并不如你想像的那样难.首先写你的头文件(header file):称为 ...

  8. dll显式加载与隐式加载

    使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...

  9. Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)

    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...

随机推荐

  1. pycharm的MySQLdb模块导不进去时解决办法

    一.Windows下python2.7安装MySQLdb模块 根据Python多少位下载对应版本: 32位:https://pypi.python.org/pypi/MySQL-python/1.2. ...

  2. ubuntu14 编译安装(升级)g++

    编译安装(升级)g++ ubuntu14自带的g++为4.8.4,不支持c++11.现要将g++升至5.2.0 1.下载安装: 参考https://www.cppfans.org/1719.html ...

  3. C#HTML与UBB(纯文本)之间的转换

    private string HtmlToUBB(string _Html)         {            _Html = Regex.Replace(_Html,"<br ...

  4. Python 模块之 pyexcel_xls

    一.适用场景 在很多数据统计或者数据分析的场景中,我们都会使用到excel: 在一些系统中我们也会使用excel作为数据导入和导出的方式,那么如何使用python加以辅助我们快速进行excel数据做更 ...

  5. mysql 内置功能 函数 date_format函数

    创建数据库db12 create database db12 charset=utf8; use db12; 准备表和记录 CREATE TABLE blog ( id INT PRIMARY KEY ...

  6. CentOS 6.5 QtCreator启动时 dbus-1的错误解决方法

    启动QtCreator提示:dbus_connection_can_send_type的错误, QString::arg: Argument missing: 无法解析dbus_connection_ ...

  7. Linux启动应用(比如jmeter)报An error occurred: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

    Linux启动应用(比如jmeter)报An error occurred: Can't connect to X11 window server using ':0.0' as the value ...

  8. Mootools遮罩层练习(原为网上的jquery写法)

    <html > <head> <meta charset="utf-8" /> <title>mootools 遮罩层</ti ...

  9. 大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)

    大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008) 分类: C#2013-08-10 18:47 1589人阅读 评论(5) 收藏 举报 NHibernat ...

  10. Apahce 加载模块说明

    LoadModule auth_basic_module modules/mod_auth_basic.so #基本认证模块 LoadModule auth_digest_module modules ...