DLL基本概念

动态链接库基本概念

 fangyukuan

2010.6.20

Windows中存在一种叫做DLLDynamic Linkable Library动态链接库)的文件。它可以提供一些应用程序可以导入的数据、函数和类。DLL文件平时驻留在磁盘中,只有当运行的应用程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅可以减少了应用程序EXE文件的大小和对内存空间的需求,耐而且这些DLL模块可以同时被多个应用程序所共享,从而极大方便了应用程序的设计。

 

以前曾经用库函数实现了代码共享。这样存在一些缺点:一个缺点是增加了应用程序的代码量,它会占用更多的磁盘空间,同时在程序运行时也会占用较大的内存空间,从而造成了系统资源的浪费;另一个缺点是,在编写大的EXE程序时,每次重建时都必须高速编译所有源代码。

 

DLL文件有以下为众所欢迎的特点

它是动态链接的,即平时它驻留在本地在计算机的硬盘中,只有当某应用程序确实要调用 这些DLL模块的情况下,系统才会将它们从磁盘上装载到内存空间中,因此它不会使应用程序的代码量加大。

它是公用的, 即当它一旦被调入内存则在内存中它只有一份文件,而该文件可以被Windows应用程序所调用。

当已经没有应用程序再需要调用它时,它会自动卸载以释放所占用的内存。

它们扩展了应用程序的特性。

它们可以用许多种编程语言来编写。

它们简化了软件项目的管理。

它们有助于资源的共享。

它们有助于应用程序的本地化

它们有助于解决平台差异。

它们可以用于一些特殊的目的。

 


动态链接库的组成

DLL必须有一个类似main函数的入口函数。还应该包含外部应用程序可以调用的函数对象资源等。

1动态链接库的入口函数。

MFC AppWizard编写DLL时,在一般的情况下它都会给程序员提供一个默认的DLL入口函数。

 

BOOL WINAPI DllMain(

  HINSTANCE hinstDLL,  // handle to DLL module

  DWORD fdwReason,     // reason for calling function

  LPVOID lpvReserved   // reserved

);

 

第一个参数:是指向DLL本身的句柄;

第二个参数:常被用来指明DLL被调用的原因;

第三个参数:是系统所保留的参数;

 

入口函数的主要作用就是在系统调用该DLL时,进行一些初始化工作。由于DLL的初始化工作常常出现如下四种情况。Windows定定义了与这4种相对应的常数。

 

ul_reason_for_call参数的常数

常数

说明

DLL_PROCESS_ATTACH

进程被调用

DLL_THREAD_ATTACH

线程被调用

DLL_PROCESS_DETACH

进程被停止

DLL_THREAD_DETACH

线程被停止

 

2导出函数和内部函数

从上述可知道DLL函数主要是为外部应用程序提供可调用的函数,因此在DLL中必须定义一些函数。DLL中的函数如果是外部应用程序可以调用的。那么这种函数就叫做导出函数(Export Function)。相反,函数如果只是为在DLL内部调用的,那么这类函数就叫做内部函数(Internal Function)。导出函数到客户端叫做导入函数

 

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761430.html


 

原文地址:https://www.cnblogs.com/fangyukuan/p/1761430.html