简单的总结一些动态链接库的一些知识,方便以后查找。

首先,新建一个动态链接库

(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概念,如何建立,如何使用,如何优化,如何查看)的更多相关文章

  1. [转]Delphi 中动态链接库(dll)的建立和使用

    动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源.由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可 ...

  2. 【重走Android之路】【路线篇(二)】知识点归纳

    [重走Android之路][路线篇(二)]知识点归纳   参考:http://blog.csdn.net/xujing81/article/details/7313507   第一阶段:Java面向对 ...

  3. 给Java新手的一些建议----Java知识点归纳(J2EE and Web 部分)

    J2EE(Java2 Enterprise Edition) 刚出现时一般会用于开发企业内部的应用系统,特别是web应用,所以渐渐,有些人就会把J2EE和web模式画上了等号.但是其实 J2EE 里面 ...

  4. 《零压力学Python》 之 第四章知识点归纳

    第四章(决策和循环)知识点归纳 if condition: indented_statements [ elif condition: Indented_statements] [else: Inde ...

  5. 《零压力学Python》 之 第三章知识点归纳

    第三章(第一个程序)知识点归纳 编程犹如写剧本.Python函数与剧本差别不大,你可以反复调用函数,而它每次都执行预定的“脚本”(脚本也可以指整个程序). 在Python IDLE中,真正的编程是从编 ...

  6. 《零压力学Python》 之 第二章知识点归纳

    第二章(数字)知识点归纳 要生成非常大的数字,最简单的办法是使用幂运算符,它由两个星号( ** )组成. 如: 在Python中,整数是绝对精确的,这意味着不管它多大,加上1后都将得到一个新的值.你将 ...

  7. 《零压力学Python》 之 第一章知识点归纳

    第一章(初识Python)知识点归纳 Python是从ABC语言衍生而来的 ABC语言是Guido参与设计的一种教学语言,为非专业编程人员所开发的. Python是荷兰程序员 Guido Van Ro ...

  8. Django知识点归纳总结之HTTP协议与URL

    Django复习知识点归纳总结 1.HTTP协议 ​ 超文本传输协议(Hyper Text Transfer Protocol),是用于万维网服务器与本地浏览器之间的传输超文本的传送协议. ​ HTT ...

  9. 动态链接库知识点总结之三(如何以显示的方式加载DLL)

    总结一下如何显示加载方式加载DLL, 首先,我们新建一个win32项目,选择dll,空项目,再添加一个源文件,一个模块定义文件(.def),具体如下图.(详细方法已经在前两篇文章中讲述,如有不懂,打开 ...

随机推荐

  1. C++ 学习基础一

    1.预处理器指示符如果文件名用尖括号“<”和”>”括起来的,则表示该文件是工程或标准头文件,查找过程会检查预定义的目录.如果文件名用双引号括起来,则表示该文件是用户自定义的头文件,查找该文 ...

  2. XCode 7.1 安装 Alcatraz包管理器失败的处理

    按照官方的文档(https://github.com/supermarin/Alcatraz),先卸载再重新安装即可.步骤如下: 1. 退出Xcode 2. rm -rf ~/Library/Appl ...

  3. 下载uboot的调试版本到开发板的sdram中运行

    开发环境:开发板:FriendlyARM Tiny6410 主机:CentOS release 6.4 (Final) 开发板与主机通过串口线连接 调试用的uboot源码为开发板光盘提供的u-boot ...

  4. WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (二)

    WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (二) 编写人:CC阿爸 2015-1-29 今天我想与大家继续一起分享这一伟大的控件.有兴趣的同 ...

  5. EF 4.1 一些操作

    1.执行返回表类型的存储过程 Create PROCEDURE [dbo].[ProSelectStu] @StudentID int AS BEGIN Select Student.* from E ...

  6. 最简单删除SQL Server中所有数据的方法

     最简单删除SQL Server中所有数据的方法 编写人:CC阿爸 2014-3-14 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间 ...

  7. MongoDb gridfs-ngnix文件存储方案 - 图片

    http://www.cnblogs.com/wintersun/p/4622205.html 在各类系统应用服务端开发中,我们经常会遇到文件存储的问题. 常见的磁盘文件系统,DBMS传统文件流存储. ...

  8. oracle函数和存储过程示例

    Function: --为了使产生的uuid符合rfc 4122的标准(http://tools.ietf.org/html/rfc4122),例如:a8f662b8-6e7a-13fe-e040-9 ...

  9. spark streaming kafka1.4.1中的低阶api createDirectStream使用总结

    转载:http://blog.csdn.net/ligt0610/article/details/47311771 由于目前每天需要从kafka中消费20亿条左右的消息,集群压力有点大,会导致job不 ...

  10. php 实现多线程

    通过php的Socket方式实现php程序的多线程.php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的.每一个访问者,当访问WEB页面的时候,都将 ...