动态链接库知识点归纳之一(DLL概念,如何建立,如何使用,如何优化,如何查看)
简单的总结一些动态链接库的一些知识,方便以后查找。
首先,新建一个动态链接库
(1) 打开编辑器,选择WIN32项目, dll,如下图,项目名字为:test,选择空项目。如下图
(2) 增加一个源文件,名字是:dll,如下图
(3) 编辑动态链接库就是为了使用动态链接库中的函数等一些东西,在这里,我们在原文件中编写两个函数(在函数头前加入_declspec(export)这是告诉编译器,此函数为“导出”函数,只有导出函数,我们才可以在其他程序中引用)。然后点击编译,如下图。
(4) 此时一个简单的动态链接库已经建立了,我们可以通过VS编译器自带的一个程序来检测我们导出的函数有哪些,首先我们要找到,.dll所在的文件夹,拷贝一下他所在的路径,在命令行下输入如下语句(dumpbin –exports + .dll所在路径)并在其后附上路径,回车,具体步骤如下图
(5) 我们可以看到,有两个函数,表示有两个函数是导出函数,尽管函数名是乱码(这个问题在后续会解决,此问题是因为编译器 名字改编)
(6) 此时,这两个函数我们可以在其他程序中使用了,首先我们新建一个对话框程序(项目名称:testdll),在其上添加两个按钮,其属性修改为如下图,此时我们要应用动态链接库中的两个函数,我们要把动态链接库中,.dll和.lib文件拷贝到当前的项目路径下。
(7) 我们把写好的.dll文件放到debug目录下(.dll文件只要放在testdll工程下即可,因为编译器会自动一级一级目录查找),但是要把把.lib文件拷贝到testdll程序所在的目录下,如下图,
此时我们要在VS编辑器下,在链接器中输入test.lib,然后应用,确定,这样才能让编译器找到引入库文件。如下图
(8) 此时,我们需要使用两个函数,还必须在程序中声明这两个函数是在外部定义的,是所在程序的”导入函数”,如下图。
(9) 我们为两个按钮建立消息响应函数,并编写如下代码,并且包含头文件
(10) Ctrl +F5 运行,点击按钮,可以正常的使用函数。
(11) 这是我们以隐式链接方式加载dll的方法。
在此,简单的介绍下,拷贝.dll和.lib文件的作用以及意义。
使用动态库时候,我们需要向程序提供两个文件,有一个引入库文件(.lib)和一个DLL(.dll)文件,对于一个DLL,其中引入库(.lib)包含该DLL导出的函数和变量的符号名,而.dll包含的是该DLL实际的函数和数据,在编译链接的时候,我们值需要引入库,而在程序执行的时候,才需要去加载DLL中导出的函数(这样才符合“动态链接库”这几个字的含义嘛)。
我们总结了如何建立以及使用DLL,但是仍有缺点,我们在使用第三方DLL时候,如果不通过一些工具(例如,dumpbin.exe等)是很难知道DLL中有哪些函数,此时我们可以使用一个技巧,就是在编写DLL时,我们把导出的函数统一放在一个头文件中(.h),使用DLL时,我们把头文件一同拷贝到程序的工程目录下,这样客户可以查看头文件,从而得到导出函数,对此
(1) 我们在dll项目中,增加一个头文件,在其中输入导出函数的声明,如下图
(2) 我们使用条件编译,这可以让一个头文件,发挥两个作用,不仅可以再DLL中声明“导出函数”,还可以在应用程序中声明DLL的“导入函数”
(3) 我们把新编辑好的DLL,重新生成,注意:每次我们只要修改DLL中的东西,我们都必须重新生成,然后把新生成的.dll和.lib文件拷贝到应用程序的目录下(现在当然也需要拷贝.h文件,.h文件与.lib放在一起就行),这一点很重要。
(4) 点击F7,运行,结果与优化之前的一样。
下一篇将会总结一下生成DLL时出现名字改编的问题,以及解决办法。以及如何在DLL中添加一个c++的类。(http://blog.csdn.net/u014028070/article/details/38510559点击打开链接)
动态链接库知识点归纳之一(DLL概念,如何建立,如何使用,如何优化,如何查看)的更多相关文章
- [转]Delphi 中动态链接库(dll)的建立和使用
动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...
- 【重走Android之路】【路线篇(二)】知识点归纳
[重走Android之路][路线篇(二)]知识点归纳 参考:http://blog.csdn.net/xujing81/article/details/7313507 第一阶段:Java面向对 ...
- 给Java新手的一些建议----Java知识点归纳(J2EE and Web 部分)
J2EE(Java2 Enterprise Edition) 刚出现时一般会用于开发企业内部的应用系统,特别是web应用,所以渐渐,有些人就会把J2EE和web模式画上了等号.但是其实 J2EE 里面 ...
- 《零压力学Python》 之 第四章知识点归纳
第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...
- 《零压力学Python》 之 第三章知识点归纳
第三章(第一个程序)知识点归纳 编程犹如写剧本.Python函数与剧本差别不大,你可以反复调用函数,而它每次都执行预定的“脚本”(脚本也可以指整个程序). 在Python IDLE中,真正的编程是从编 ...
- 《零压力学Python》 之 第二章知识点归纳
第二章(数字)知识点归纳 要生成非常大的数字,最简单的办法是使用幂运算符,它由两个星号( ** )组成. 如: 在Python中,整数是绝对精确的,这意味着不管它多大,加上1后都将得到一个新的值.你将 ...
- 《零压力学Python》 之 第一章知识点归纳
第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...
- Django知识点归纳总结之HTTP协议与URL
Django复习知识点归纳总结 1.HTTP协议 超文本传输协议(Hyper Text Transfer Protocol),是用于万维网服务器与本地浏览器之间的传输超文本的传送协议. HTT ...
- 动态链接库知识点总结之三(如何以显示的方式加载DLL)
总结一下如何显示加载方式加载DLL, 首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图.(详细方法已经在前两篇文章中讲述,如有不懂,打开 ...
随机推荐
- boost实现串口通信(一):小试牛刀
/************************************************************************/ /* 功能:boost实现串口通信类 */ /* ...
- 凡聊过必留下痕迹-破解加密的WeChat数据库
有个朋友上门寻求协助,带着她朋友的朋友的手机,说是手机硬件有问题,想把手机内的资料都备份出来,尤其是WeChat的聊天内容…我跟她说,那iTool等工具不就可以帮上忙了吗?没想到她早就试过了, 说iT ...
- leetcode 6
题目描述: 该开始就输在了理解题意上.. 没搞懂zigzag是什么意思. 查了一些解释终于明白要干什么了. 将一个字符串按照Z字形排列(侧着看):再把结果按行输出. 刚开始的想法是讲字符串按照 ...
- JSF的ui标签
在使用自己的tag时,首先需要在web.xml里面进行注册,注册方式是在web.xml开头加上: <context-param> <param-name>fac ...
- tostring格式化输出
C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...
- C/C++下Netbeans的配置
目录 目录1 1 netbeans开发环境搭建2 2 netbeans工程管理2 2.1 采用IDE自动生成Makefile2 3 netbeans工程配置2 3.1 编译工具链3 3.1.1 添加配 ...
- Windowsphone本地应用信息与市场信息的获取
本地信息都存放在 WMAppManifest 里面,获取就不用说了...知道位置 就知道怎么获取了.. 主要是讲那个 市场上面的详情怎么获取,就是API调用显示在这个页面里面的详情: public v ...
- 显示或隐藏一个Grid
The Rowset class contains two methods that can be used to show and hide all rows: ShowAllRows() Hide ...
- 深入浅出MongoDB(一)NoSQL
从本文开始,我们一起学习一下MongoDB相关内容,在学习MongoDB之前,首先要做的就是学习NoSQL. 为什么要学习NoSQL,原因很简单,因为MongoDB是NoSQL数据库的一种,换言之,如 ...
- Yii 操作提示框实现
如图: html + css 代码: 这是 YII 模板的写法 欢迎使用Yii <style> div.success{ background: #C5FBBD; border: ...