转至CSDN,原链接:https://blog.csdn.net/hellomike/article/details/4719338

1、隐式链接:
隐式链接的特点是由编译器完成对DLL的加载和程序结束时对DLL的卸载工作,如果程序结束时如果还有其他应用程序使用该DLL,那么系统会使DLL的使用计数减1,当DLL的使用计数降为0时,会将DLL从内存中删除。
★优缺点:隐式链接DLL的方法简单实用,但缺少灵活性。
■使用方法:使用隐式链接DLL开发时,首先,需要将DLL的引入库文件(*.lib--编译生成DLL时,会一起生成的)与应用程序进行静态链接,因为引入库文件包含DLL的各种输出资源,如导出函数,导出类等信息,这些信息指向DLL的函数指针等等,EXE执行时,DLL被 “自动” 加载,EXE退出时DLL被 “自动” 卸载。

2、显示链接:
显示链接方式是完全由编程者用API 加载和卸载DLL,编程者可以决定何时加载DLL,加载哪个DLL,何时卸载DLL,卸载哪个DLL等。
★优缺点:显示链接方式充分体现了DLL的灵活性,是比较常用的调用DLL方式。但是与静态链接相比稍微复杂了些。
■使用方法:
LoadLibrary(...):该 API 用于加载指定的DLL;
GetProcAddress(...):该 API 用于获取DLL中导出函数的指针, 即导出函数的入口点;
FreeLibrary(...):该 API 用于卸载指定的DLL。

〓注:如果程序中多次调用LoadLibrary(...)加载同一DLL时,在卸载的时候也要调用相应次数的FreeLibrary(...)进行卸载。

3、举例说明……
▲使用LoadLibrary显式链接,在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,Windows将遵循如下的搜索顺序来定位DLL:

①EXE文件所在的目录:
②进程的当前工作目录:
③Windows系统目录:例如:C:/WINDOWS/system32
④Windows目录:例如:C:/WINDOWS
⑤环境变量的目录:我的电脑-->属性-->高级-->环境变量

说明:
●进程的当前工作目录:使用函数SetCurrentDirectory(...)设置的路径,或者从父进程继承而来的路径,使用GetCurrentDirectory(...)得到。
●EXE文件所在的目录:本EXE文件所在的绝对路径, 使用GetModuleFileName得到。
两者可能不同。

▲GetProcAddress函数可以有两种方式取得DLL导出函数的入口点:
例如:
GetProcAddress(hMod, "add"); //按照函数名称方式;
GetProcAddress(hMod, MAKEINTRESOURCEA(1)); //按照导出函数序号方式;
---------------------
作者:hellomike
来源:CSDN
原文:https://blog.csdn.net/hellomike/article/details/4719338
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/kamiya/p/9945403.html

DLL 导入的两种方式相关推荐

  1. python模块的导入的两种方式区别详解

    Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...

  2. .net core 调用c dll_C++ 调用C封装DLL库的两种方式

    编写DLL代码 新建工程 新建空项目工程 点击确定.然后右键项目选择新建项. 出现下图,选择头文件. 再次选择新建项,选中C++文件,将其改为MySocketClient.c,然后选择添加. 到这里, ...

  3. DLL中导出函数的声明有两种方式

    本文引用自:VC编程时DLL中导出函数的声明有两种方式 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链 ...

  4. 判断dll的.netframwork的版本的两种方式

    1.使用ILSpy将dll打开,如下图可以看到.NETFramework的版本: 2.使用反射,代码如下: var tar = (TargetFrameworkAttribute)Assembly.L ...

  5. MySQL数据导入导出的两种方式

    文章目录 前言 一.使用Navicat Premium数据库可视化工具的企业管理器导入导出数据 1.企业管理器导入步骤: 2.企业管理器导出步骤: 二.cmd方式导入导出数据 1.cmd导入步骤: 2 ...

  6. [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现

    第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...

  7. 动态连接库的两种方式

    动态连接库的两种方式? 答案:调用一个DLL中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样.这需 ...

  8. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

  9. jvm两种方式获取对象所占用的内存

    在开发过程中,我们有时需要来获取某个对象的大小,以方便我们参考,来决定开发的技术方案.jvm中提供了两种方式来获取一个对象的大小. 通过Instrumentation来计算对象的大小 编写计算代码: ...

最新文章

  1. Mysql| Mysql函数,聚集函数的介绍与使用(Lower,Date,Mod,AVG,...)
  2. python configparser模块来 读取 、 创建 和 修改 配置文件
  3. 整理JavaScript中,数组和字符的操作方法
  4. js 判断对象是否是Array
  5. 贪婪模式与非贪婪模式
  6. Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
  7. 机器学习tips:什么是pipeline?
  8. 10个实现炫酷UI设计效果的CSS生成工具
  9. 水晶报表for java_水晶报表(crystal reports)--java
  10. matlab GUI画图实例——手动输入函数画图
  11. Java调用第三方接口(http总结)
  12. big O notation - 大 O 表示法
  13. 毕业生写论文必备!! 设置奇数偶数页眉不同,奇数页是对应本章章节名,偶数页为论文名
  14. nova5 pro Android id,华为nova5pro支持NFC功能吗?
  15. Python爬虫-字体反爬-猫眼国内票房榜
  16. 算法复杂性分析及运算规则证明(一)
  17. 系统间接口调用/接口对接 Java
  18. 四十九、HBase介绍
  19. linux系统中vi/vim文本编辑器的使用简介
  20. html怎么在alert中加标题,js重写alert事件(避免alert弹框标题出现网址)

热门文章

  1. 511遇见易语言基础命令组件和算法
  2. 机器学习:参数模型、非参数模型
  3. 堡垒机是干什么的?堡垒机的主要功能是什么?堡垒机的目标价值有哪些?
  4. 洛谷刷题笔记 打印 ASCII 码
  5. Java安全入门(二)——CC链1 分析+详解
  6. 【调剂】南京邮电大学2020年硕士研究生招生调剂预告及相关说明
  7. ojdbc下载不下来
  8. 如何取消Windows server 2016登录密码
  9. this和e.target
  10. java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链