动态链接库

来源:互联网 发布:自然知彼 编辑:程序博客网 时间:2024/04/29 13:55

动态链接库

1)  动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。

2)  Windows API中的所有函数都包含在DLL中。其中有3个最重要的DLLKernel32.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.libdll1.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文件

原创粉丝点击