动态链接库知识点总结之三(如何以显示的方式加载DLL)
总结一下如何显示加载方式加载DLL,
首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图。(详细方法已经在前两篇文章中讲述,如有不懂,打开链接查看)
(1) 新建项目,名称为:dll,添加一个源文件(.cpp),编代码,编译文件 。
(2) 为项目添加一个模块定义文件(上一篇文章中详细介绍)(先新建一个文本,再改属性名),编辑代码,如下图
(3) 新建一个DLL测试应用程序(基于对话框的),项目名字:TestDLL,添加一个按钮,属性如下,先编译一下。
(4) 为按钮添加一个响应函数,编写如下代码(具体代码含义在最后介绍)
(5) 把已经编译好的DLL,选择.dll文件将拷贝到应用程序目录下(dll放在与该测试文件的.exe文件夹下(具体做法已在前两篇介绍过),如图
(7) 点击,运行,成功运行,以显示的方式加载DLL成功
现在介绍下,按钮消息响应函数中的代码含义。
函数LoadLibrary()作用是将可执行模块映射到进程的地址空间,通俗点来说,就是可以用来加载DLL的,这个函数是显示加载DLL的重要函数。参数是DLL的名称,这个函数在MSDN上有详细的解释,大家可以通过以下链接查看。该函数返回的是所加载的DLL的句柄。(点击打开链接)
有了DLL的句柄,我们需要再获得导出函数的地址即可,获得地址,用此函数:GetProcAddress(),参数1是:DLL句柄,参数2:一个指针,指向导出函数的名字。该函数返回值如果为NULL,则获取地址失败。成功,则返回导出函数的导出地址。
有了地址,我们如何操纵函数,我们还需要一个函数指针,使用函数指针来调用导出函数。
在此我们总结一下:
动态加载DLL时,客户端程序不再需要包含引入库文件,只需要.dll文件即可。静态加载和动态加载各有各的优缺点,首先,静态加载DLL比较简单,但是如果需要加载的DLL过多的话会造成启动程序过慢,所以还是选择动态加载比较好。
动态链接库知识点总结之三(如何以显示的方式加载DLL)的更多相关文章
- 无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败。
无法加载 DLL“rasapi32.dll”: 动态链接库(DLL)初始化例程失败. 在Asp.Net项目中使用WebClient或HttpWebRequest时出现以上错误 解决方案:把以下代码放在 ...
- webpack中dev-server不写contentBase时如何设置可以显示页面并且加载js
今天学习了dev-server这个配置,中间遇到疑惑,我写了contentBase是可以走通,可以再localhost:8080看到页面并且正确加载bundle.js的,但是这个contentBase ...
- 测试img在不显示时是否加载?
一直搞不明白,隐藏的元素的背景图,在页面加载时,是否自动加载? img隐藏时,图片会加载吗? 测试代码如下: <!DOCTYPE html> <html> <head&g ...
- Android中高效的显示图片之一 ——加载大图
在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图 ...
- xp系统重绘边框线不显示(首次加载没有触发paint事件)
同样是,重绘边框事件,win7系统显示正常,而xp系统却不显示,这是什么原因造成的呢? 于是,小编开始百度,不停的查找原因,通过一番查找,小编也意外的收获了一些内容: 例如:窗口的拖动,放大,缩小,等 ...
- 【技巧】easyUI datagrid在隐藏时加载,显示时无法加载出界面
注意在显示时调用再调用一次resize就可以显示出来 $("#"+datagridId).datagrid("resize");
- Android 显示 WebView ,加载URL 时,向webview的 header 里面传递参数
1.主要布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...
- Virtualbox安装增强功能时显示【未能加载虚拟光盘】
我之前在安装Virtualbox时进行到安装增强功能时弹出了一个窗口,提示我"未能加载虚拟光盘到虚拟电脑",如下图 我尝试了多次都是这个情况,经过上网学习我找到了问题所在,我在第一 ...
- C++加载dll失败或显示乱码
右键项目-属性-字符集-使用多字节字符集
随机推荐
- ios delegate 代理模式 观察者模式 不同视图间的通信
delegate,在ios中比比皆是,NSURLConnection(网络请求有),tableView, connectionView,等系统自带 的常见代理.甚至,自己写代码的时候,随意间敲打出了p ...
- leetcode 27
27. Remove Element Given an array and a value, remove all instances of that value in place and retur ...
- css3mediaquery移动端网页字体适应屏幕代码
@media screen and (min-width:320px) and (max-width:321px) { html { font-size: 62.5%; } } @media scre ...
- 2.2安装JDK
在Ubuntu下安装JDK的步骤: (1)首先需要自己安装的Ubuntu系统是多少位的,可以使用命令[getconf LONG_BIT]获取这个信息: (2)在JDK官网下载相应(选取和Linux系统 ...
- php5.3 连接 sqlserver2005
操作系统:XP php5.3以后,已经不对sqlserver支持连接扩展了,不过微软官方还是对php5.3以后进行了扩展解决方案. 1.确认要连接sqlserver的数据库版本为2005 2.确认ph ...
- C puzzles详解【46-50题】
第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http:// ...
- ASP.NET中Server对象的几个方法
HtmlDecode 已重载. 对已被编码以消除无效 HTML 字符的字符串进行解码.HtmlEncode 已重载. 对要在浏览器中显示的字符串进行编码.MapPath 返回与 Web 服务器上的指定 ...
- [leetcode]_Count and Say
题目:一开始没看懂, 后头经过WA发现 输出 的意义 是 出现的次数+值. 1 => 一个1 => 11 11 => 两个1 => 21 111=> 三个1 => ...
- C#发送邮件源码
介绍 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/IP协议 ...
- C#和.NET版本
1999年,就听说微软公司在研发一种名为“cool”的新开发语言,而具体内幕一直是个谜,直到2000年6月26日微软在奥兰多举行的“职业开发人员技术大会”(PDC 2000)上,这个谜底终于揭晓了,这 ...