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

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

(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. .NET 可选择的转型路径(转)

    新的一年,您在学习和工作上,想坚守所学,还是尝试转型呢? (1) 继续钻研 C# 4.0 / AJAX / LINQ to AD.LINQ to JavaScript / WF, WCF, WPF, ...

  2. pig命令行快捷键

    删除 ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl + k 删除光标后面所有字符相当于VIM里d ...

  3. Jquery在线引用地址:

    转自:http://www.cnblogs.com/lkf18/archive/2012/12/11/2813241.html 1. 很多网站都是使用这种方式引入,客户的浏览器可能已经缓存过了 jqu ...

  4. DropDownList的用法

    DropDownList是一个下拉列表菜单,平时我们也会经常用到,下面就来看看如何绑定值 1>     静态添加,就是说在值都很明确的情况下 ListItem list1 = new ListI ...

  5. 设计模式-单例模式(Singleton)

    模式说明: 保证每一个类仅有一个实例,并提供一个访问它的全局访问点(即自行实例化并向整个系统提供这个实例). 应用场景: 1.如配置文件取值类AppConfig(本身实例化对象比较大,且没有必要实例化 ...

  6. Windows Phone 开发起步之旅之一 平台环境的搭建

    最近大家都在写博客园的技术文章,按耐不住了,也把自己平时学习中遇到和学习到的一些东西写出来,供大家分享也好,自己留个纪念也好,有个可以查看的东西. 言归正传,随着微软对Windows Phone的投入 ...

  7. xls数据导入sqlite数据库

      protected void btn_ok_Click(object sender, EventArgs e)     {         try         {             st ...

  8. C# 判断一字符串是否为合法数字(正则表达式)

    判断一个字符串是否为合法整数(不限制长度) public static bool IsInteger(string s) { string pattern = @"^\d*$"; ...

  9. Hbase之shell操作

    一. 介绍 HBase是一个分布式的.面向列的 开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源 ...

  10. Nginx下10个安全问题提示

    Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你的 ...