动态链接库

来源:互联网 发布:八大家族 红色后代知乎 编辑:程序博客网 时间:2024/06/06 03:25

动态链接库

动态链接库顾名思义就是编译的时候不被编译进.exe可执行文件,而是在程序运行的时候动态加载.dll里面的可执行代码。
动态链接库的创建跟静态链接库的创建类似:如图所示
1.新建,项目,Visual C++项目,Win32 Console Application.

2.点击完成创建dll类库项目
对于动态链接库里面的方法有两种情况:(这是跟静态类库不一样的地方)
  1. 导出函数:可以供应用程序调用。
  2. 非导出函数(内部函数):只能Dll本身才能使用的函数,外部的应用程序是无法调用的。
        __declspec(dllexport) double Add(double a,double b);//单个函数可导出                class __declspec(dllexport) MyMathFuncs//整个类都是可导出的,里面的方法在外部程序都可以调用                {                    ......                };

使用动态链接库

静态加载:

程序编译的时候需要知道.dll的存在,就是编译器需要知道这个dll里面的函数类型是什么放在.exe可执行文件内存空间的什么地方,要加载的dll物理路径,占多大的内存,这个都是要事先知道的(个人理解呵呵,不知道准确不准确)。所以必须提供动态链接库的.h、.lib、.dll文件,三个缺一不可。
对于dll动态链接库的引用也有几种方式这里就不在赘述。
使用Visual Studio 2012IDE集成开发环境右键直接引用就可以了,然后指定.h头文件的位置,方便我们调用dll里面的方法。
步骤:请在“属性页”对话框中展开“配置属性”节点,然后展开“C/C++”节点,并选择“常规”。 在“附加包含目录”旁边,指定 MathFuncsDll.h 头文件所在位置的路径。 可以使用相对路径(例如 ..\MathFuncsDll\),然后选择“确定”按钮。
还有就是代码的方式和配置文件的方式了引入了,代码的方式如下:
#include "..\DllLib.h"#pragma comment(lib,"..\\debug\\DllLib.lib")
指定编译的时候把dll相关信息跟当前项目的obj进行链接,然后直接就可以使用dll文件里面的方法了。
具体的参看以下地址:
http://msdn.microsoft.com/zh-cn/library/d14wsce5.aspx
静态加载的缺点:
1.程序开始运行的时候就要加载dll文件,没有文件的话程序运行不了。
2.dll文件太多的情况下,很占用资源,你想想那么多的代码放到内存里面能不占资源吗!呵呵

动态加载:(优点:只需要提供dll文件就可以了)

动态加载分3步骤:(C#里面的发射机制就是这么来的!)
  1. 首先加载*.dll文件
  2. 找到*dll种的方法,并调用
  3. 释放*dll资源
具体的代码可以参见CSDN上面很详细。



补充:动态链接库有2种调用方式,一种是应用程序项目和类库项目在同一个解决方案下面,另外一种是应用程序项目和Dll项目不在同一个解决方案下面。
主要讲解下不在同一个解决方案下面的时候:
这种情况下我们要注意了,当我们调试DLL的时候,我们要把应用程序生成的exe文件拷贝到dll项目的debug文件夹下面,并且生成exe的时候,exe所使用的.lib文件和.dll文件要和当前的类库项目里面的文件保持一致,不然调试dll项目的时候不会命中断点,会提示你当前项目有尚未加载完的符号(类似这样的提示)!

汇编lea指令的意思                                      
lea ecx,[esi+54]   ;
lea指令区别于mov指令,Lea直接得到esi的地址+54的偏移得到的新的地址直接传给ecx
             如果是mov指令的话就会得到esi的地址+54的偏移得到的新的地址里面的内容传给ecx
一个是地址,一个是地址里面的内容