VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 482|回复: 1

VC++动态库编程-[3]DLL导出函数的调用

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-1-9 22:44:25 | 显示全部楼层 |阅读模式
上节课给大家讲解了DLL如何导出函数,那么这节课给大家讲解在EXE中如何调用DLL的导出函数,进行使用。

上节已经给大家说过了,DLL进行导出函数有2种方法,那么与之对应的调用DLL的导出函数的方法也有2种。

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)); //按照导出函数序号方式;

本套教程由VC驿站原创,完全免费!
相关课程演示细节还请观看视频教程!
教程下载地址:https://www.cctry.com/thread-7-1-1.html




上一篇:VC++动态库编程-[2]入口点函数及其导出函数的讲解
下一篇:VC++动态库编程-[4]MFC规则DLL讲解

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

75_avatar_middle
在线会员 besteast 发表于 2018-1-21 09:15:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-11 05:08

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表