学习Windows DLL的笔记之一 【DLL基本知识】

Dll是什么?

DLL是作为共享库的一种可执行文件。它为提供了一种方法,让进程能够访问不属于本进程的函数。多个进程能共享一份DLL,即节约了内存和磁盘空间,又方便升级和售后服务。


Dll和应用程序的区别?

对终端用户来说,两者都是可执行模块,但是最明显的区别是应用程序能够直接执行,而DLL却不能直接执行。

对系统来说,应用程序可以有多个实例,而DLL只能存在一份;应用程序可以拥有自己的堆栈、全局内存、文件句柄及消息队列,而DLL却不能。

 

DLL的分类

可以分为普通DLL,MFC扩展DLL,存资源DLL。

 

DLL的加载

有显式加载和隐式加载。

显式加载就是调用LoadLibrary函数,使用完以后用FreeLibrary来卸载DLL。

隐式加载就是系统帮助你加载DLL,在使用隐式加载方式时,在编译阶段必须提供导出函数的头文件及lib文件。该LIB文件只包含了函数的符号和序号信息,并没有具体代码,只是提供连接器连接时能够找到符合而已。

 

DLL中函数的导出方式

有两种方式来导出函数: 

1. 模块定义.DEF文件,在模块定义文件中列出要导出的文件。定义模块文件的格式如下:

LIBRARY YOURDLLNAME 

 

EXPORTS

function_name @1

function_name @2 

2. 在用导出的函数定义前,使用关键字__declspec(dllexport)修饰。如  __declspec(dllexport) int add(int a,int b);这样导出的函数的名字可能被修改了,所以为了名字不被修改,可以用extern "C" 来修饰.

extern "C" 有两层意思,首先extern关键字是表明该函数或变量的作用范围是全局的,可以在本模块或其他模块使用。而“C"是告诉编译器和连接器把该函数作为C语言的方式来编译连接即不要修改函数名字,由于C++允许重载,所以int foo(int a); int foo(int a,int b);同名函数是允许的,所以为了区别这两个函数,C++编译器会自动修改名字来加以区别,如第一个函数可能会被修改成 foo_int,第二个函数foo_int_int。而加了”C“以后,名字不会被修改,当然这时就不能使用重载,如

extern "C" {

int foo(int a){}

int foo(int a,int b){}

这样就编译出错C2733,因为编译器无法区分这两者。 

 

posted on 2011-03-21 11:29  呼风唤雨  阅读(595)  评论(0编辑  收藏  举报

导航