动态链接库
来源:互联网 发布:自然知彼 编辑:程序博客网 时间:2024/04/29 13:55
动态链接库
1) 动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。
2) Windows API中的所有函数都包含在DLL中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。
静态库和动态库
1) 静态库:函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。
2) 在使用动态库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。
使用动态链接库的好处
1) 可以采用多种编程语言来编写。
2) 增强产品的功能。
3) 提供二次开发的平台。
4) 简化项目管理。
5) 可以节省磁盘空间和内存。
6) 有助于资源的共享。
7) 有助于实现应用程序的本地化。
动态链接库加载的两种方式
1) 隐式链接
2) 显式加载
下面通过简单的程序来介绍隐式链接的方法:
编写加法和减法程序的动态链接库dll1
_declspec(dllexport)int add(int a,int b)
{
return a+b;
}
_declspec(dllexport)int sub(int a,int b)
{
return a-b;
}
class _declspec(dllexport) Point
{
public:
void output(int x,int y);
};
则将dll1.lib和dll1.dll拷贝到外部程序dlltest中,并在dlltest工程->设置->链接中将dll1.lib加入,并在外部程序中申明下面代码即可访问此链接库
_declspec(dllimport)int add(int a,int b);
_declspec(dllimport)int sub(int a,int b);
_declspec(dllimport) class Point;
如果要实现C++和C语言之间动态链接库的相互调用,此时可将定义代码修改为如下代码:
extern “C” declspec(dllimport)int add(int a,int b);
下面通过简单的程序来介绍显式链接的方法:
编写加法程序的动态链接库dll2
int add(int a,int b)
{
return a+b;
}
在dll2工程中新建记事本程序,取名为dll2.def,然后将此文件加入到工程中。加入以下代码:
LIBRARY dll2
EXPORTS
add
sub
在外部程序中使用LoadLibrary来加载动态链接库:
HINSTANCE hinst;
hinst=LoadLibrary("dll2.dll");
typedef int (*ADDROC)(int a,int b);
ADDROC addr=(ADDROC)GetProcAddress(hinst,"add");
if(!addr)
{
MessageBox("获取函数地址失败");
return ;
}
CString str;
str.Format("5+3=%d",addr(5,3));
MessageBox(str);
此时只要将dll2.dll文件拷贝到外部程序中即可,不需要dll2.lib文件
- 动态链接库、静态链接库;动态链接、静态链接
- 动态链接,静态链接,动态链接库,静态链接库
- 应用程序链接动态链接库
- cmake 链接动态链接库
- 动态链接和动态链接库
- 动态链接库-原理
- 动态链接库-实现
- 创建动态链接库
- 动态链接库
- 动态链接库
- 动态链接库
- 动态链接库
- 动态链接库
- 动态链接库小结
- 动态链接库简介
- 什么是动态链接库
- 什么是动态链接库?
- 动态链接库
- js/css压缩
- FLEX3中应用CSS完全详解
- 单态设计模式
- flex 分页控件
- is not abstract and does not override abstract method getIncludes() in org.apache.jasper.runtime.HttpJspBase 问题
- 动态链接库
- 羡慕和嫉妒别人会失去自己
- strucs工程里,用自己写的java类读取jsp的表单,然后写入写入数据库,但是中文成乱码..
- GSS-API 与Kerberos 的关系
- 背景图片向下滚动
- WHERE,HAVING之间的区别和用法
- 数据库管理专才四步走
- 文字向上滚动效果
- JS关闭窗口或JS关闭页面的几种代码