动态链接库
来源:互联网 发布:八大家族 红色后代知乎 编辑:程序博客网 时间:2024/06/06 03:25
动态链接库
动态链接库顾名思义就是编译的时候不被编译进.exe可执行文件,而是在程序运行的时候动态加载.dll里面的可执行代码。
动态链接库的创建跟静态链接库的创建类似:如图所示
1.新建,项目,Visual C++项目,Win32 Console Application.
2.点击完成创建dll类库项目
对于动态链接库里面的方法有两种情况:(这是跟静态类库不一样的地方)
- 导出函数:可以供应用程序调用。
- 非导出函数(内部函数):只能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#里面的发射机制就是这么来的!)
- 首先加载*.dll文件
- 找到*dll种的方法,并调用
- 释放*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
一个是地址,一个是地址里面的内容
- 动态链接库、静态链接库;动态链接、静态链接
- 动态链接,静态链接,动态链接库,静态链接库
- 应用程序链接动态链接库
- cmake 链接动态链接库
- 动态链接和动态链接库
- 动态链接库-原理
- 动态链接库-实现
- 创建动态链接库
- 动态链接库
- 动态链接库
- 动态链接库
- 动态链接库
- 动态链接库
- 动态链接库小结
- 动态链接库简介
- 什么是动态链接库
- 什么是动态链接库?
- 动态链接库
- ORA-01110 错误处理
- WPF之路——Grid(网格)
- .net如何实现页面间的参数传递
- 《好了歌》和《好了歌注》
- 最有效的减肥六大招,你做了哪个?
- 动态链接库
- win7下vs2008完美破解安装
- linux文件系统—inode及相关概念 inode大小的最佳设置
- [转载]走出浮躁的泥沼:把一件事做到某种境界
- ora-01652无法通过128(在表空间temp中)扩展temp段
- 【ARM学习笔记】一、S3C2440A官方简介
- Android SQLite - close() was never explicitly called on database
- 让ProgressDialog在setCancelable(false)时按返回键可dismiss
- c# IrisSkin4皮肤控件美化界面用法