动态链接库基本概念
在 Windows中存在一种叫做DLL(Dynamic 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)。导出函数到客户端叫做导入函数。