可执行文件.exe链接(或加载)DLL有以下两种形式:

隐式链接是指静态加载或在程序加载时动态链接。

通过隐式链接,在使用DLL时,可执行文件链接到一个由生成DLL的人提供的导入函数库(.lib 文件)。操作系统在使用这个函数库的执行文件被加载时,加载DLL。这个客户端可执行文件调用DLL的导出函数,就像函数包含在可执行文件中一样。

显式链接是指动态加载或在程序运行时动态链接。

通过显示链接,使用DLL的可执行文件必须使用函数调用显式加载(load)和卸载(unload)DLL,然后获取DLL的导出函数。客户端可执行文件必须通过一个函数指针调用导出函数。

一个可执行文件能对相同的DLL使用任意一个链接方法。此外,这些机制并不相互排斥,当一个可执行文件隐式链接一个DLL而另外一个可执行文件能显示链接它。

隐式链接使用方法

要隐式链接到DLL,可执行文件必须从DLL的提供程序获取以下内容:

  • 包含导出的函数或C ++类的声明的头文件(.h文件)。类,函数和数据都应具有__declspec(dllimport),有关更多信息,请参阅dllexport,dllimport。
  • 用于链接的导入库(.LIB文件)。 (链接器在DLL生成时创建导入库。)
  • 真实存在的DLL(.dll文件)。

  使用DLL的可执行文件必须包含每个源文件中包含导出函数(或C ++类)的头文件,该文件包含对导出函数的调用。从写代码角度来看,对导出函数的函数调用就像其他任何函数调用一样。

  要构建调用的可执行文件,您必须链接到导入库。如果你正在使用外部生成文件,请指定导入库的文件名,其中列出了您要链接的其他对象(.obj)文件或库。

  操作系统在加载调用的可执行文件时必须能够找到DLL文件。

显式链接

通过显示链接,应用程序必须在运行时使用一个函数调用以显式加载DLL。要明确链接到DLL,应用程序必须:

  • 调用LoadLibrary(或类似的函数)来加载DLL并获取模块句柄。
  • 调用GetProcAddress以获取应用程序想要调用的每个导出函数的函数指针。由于应用程序通过指针调用DLL的函数,因此编译器不会生成外部引用,所以不再需要链接到导入函数库了。
  • 在完成DLL时调用FreeLibrary。

例如:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
... HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal; hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"DLLFunc1");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
{
// call the function
uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
}
}

Game over 结束。

参考链接:

DLLs in Visual C++

Linking an Executable to a DLL

Linking Implicitly

Explicit linking

dllexport, dllimport

【原创翻译】链接DLL至可执行文件---翻译自MSDN的更多相关文章

  1. 百度翻译api 实现简易微信翻译小程序

    介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示   使用百度翻译api需要申请 appid 与 key 并在 ap ...

  2. CopyTranslator-复制即翻译的外文辅助阅读翻译解决方案

    英语/English 复制即翻译的外文辅助阅读翻译解决方案 请尽快更新到,这是你没有体验过的全新版本,只需3分钟,你就会跟我一样,爱上这个软件. 如果您觉得软件对您有所帮助,不用follow,不用fo ...

  3. 动态链接 - dll和so文件区别与构成

    动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库.大多数操作系统将解析外部引用(比如库)作为加载过程的一部分.在这些系统上,可执行文件包含一个叫做import   directory的 ...

  4. 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)

    现在的翻译软件功能越来越多,也越来越臃肿,还不时弹广告,真的很烦恼. 鉴于这种情况,自己做了个翻译软件,能满足日常需求就好了.需要用的时候可以直接在桌面输入单词翻译,或者直接使用快捷键呼出翻译窗口.最 ...

  5. (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果

    环境: 火狐浏览器 pycharm2017.3.3 python3.5 1.url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我 ...

  6. 根据条件返回相应值 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注 ...

  7. Android使用有道翻译API实如今线翻译功能

    在Android应用中,加入在线翻译的功能,这里调用的是有道翻译的API. 使用有道翻译API.首先要申请一个key,申请地址为:path=data-mode">有道翻译API申请地址 ...

  8. 1.预处理,生成预编译文件(.文件): Gcc –E hello.c –o hello.i 2.编译,生成汇编代码(.s文件): Gcc –S hello.i –o hello.s 3.汇编,生成目标文件(.o文件): Gcc –c hello.s –o hello.o 4.链接,生成可执行文件: linux笔记

    1 动态查看日志 tail -f filename tail -1000f filename 2 解压当前目录内容为xxx.zip  zip -r xxx.zip ./* 3 查看内存使用情况 fre ...

  9. oracle函数 decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    [功能]根据条件返回相应值 [参数]c1, c2, ...,cn,字符型/数值型/日期型,必须类型相同或null 注:值1……n 不能为条件表达式,这种情况只能用case when then end解 ...

随机推荐

  1. java try·····catch·····异常处理学习

    异常处理(又称为错误处理)功能 用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件). try....catch....只是异常处理的一种常用方法 try{ //可能导致异常 ...

  2. Vs2013+opencv2.4.12+x64用VideoCapture无法打开视频

    环境变量中匹配的是x86的opencv_ffmpeg244.dll,与项目不匹配,需在项目exe文件同目录下添加X:\opencv\opencv2.4.12\build\x64\vc12\bin\op ...

  3. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时24&&25

    课时24 深度学习开源库使用介绍(上) Caffe 被用于重新实现AlexNet,然后用AlexNet的特征来解决其他事情 用C++书写的,可以去GitHub上面读取源代码 主要四个类: Blob可以 ...

  4. 模拟模板替换功能--js

    概要: 因为之前的项目是angular开发(vue和react也是一样),对其中的双向数据绑定的使用感觉很方便,然后就思考怎么使用到jquery框架中来,适用于 列表生成 知识点: 正则与其反向引用, ...

  5. Eclipse中,open declaration;open implementation;open super implementation的区别

    open declaration:是打开该方法的接口文件(一般没实在意义,只是简单一句):open implementation:是打开具体实现该方法的类文件(具体逻辑的处理地方,方法的主要实现的地方 ...

  6. 考拉定时任务框架kSchedule

    此文已由作者杨凯明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.背景 目前项目中使用的定时任务框架存在下面这些问题 没有统一的定时任务管理平台 目前项目中使用定时任务的 ...

  7. bzoj 3992: [SDOI2015]序列统计【原根+生成函数+NTT+快速幂】

    还是没有理解透原根--题目提示其实挺明显的,M是质数,然后1<=x<=M-1 这种计数就容易想到生成函数,但是生成函数是加法,而这里是乘法,所以要想办法变成加法 首先因为0和任何数乘都是0 ...

  8. springboot整合H2内存数据库,实现单元测试与数据库无关性

    一.新建spring boot工程 新建工程的时候,需要加入JPA,H2依赖 二.工程结构   pom文件依赖如下: <?xml version="1.0" encoding ...

  9. touch的基本用法

    touch的基本功能是改变文件的时间戳,以下是三种常用用法: 1.创建一个空文件 以当前时间为时间戳创建一个空文件.$ touch touch.txt //touch.txt不存在 2.更改文件时间戳 ...

  10. YCOJ单向公路

    题目: 描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另 ...