DLL, 动态链接库, Dynamic-link library.一直以来都是Windows操作系统的基石。Window应用程序编程接口提供的所有函数都包含在DLL中。其中三个最重要的DLL分别是Kernel32.dll,User32.dll,GDI32.dll。Kernel32.dll ,包含的函数用来管理内存、进程以及线程;User32.dll包含的函数用来执行与用户界面相关的任务,如创建窗口和发送消息。GDI32.dll,包含的函数用来绘制图像和显示文字。Windows Mobile中重要的DLL是Coredll.dll.
Windows系统广泛使用DLL,那么我们使用DLL的理由是什么?下面是在《Windows 核心编程中》摘录的一部分:
一是扩展了应用程序的特性;
二是简化了项目的管理;
三是有助于节省内存;
四是促进了资源的共享;
五是促进了本地化;
六是有助于解决平台间的差异;
七是可以用于特殊目的。
目前用到的地方在 节省内存、资源共享、本地化、特殊目的。这几个是我在项目中见过的。DLL如何使用呢?一般有两种方法,一是隐式载入时链接(implicit load-time linking)和显示运行时链接(explicit run-time linking)。
隐式链接,常用的方法是将DLL的头文件和LIB文件包含到执行文件程序中,相应DLL放到执行文件对应的目录。基本就OK了。
例如:
DLL为MyLib.dll,其头文件为MyLib.h, LIB文件为MyLib.lib。
我们在执行文件中使用是,需要做如下操作:
#include "MyLib.h"
#pragma comment(lib, "MyLib.lib")
即可实现隐式调用,变量、函数、类就可实现调用。
这里lib文件非常小,它并不包含任何函数或变量,它只是列出了所有被导出的函数和变量的变量名,具体的实现在dll文件中。编译阶段不包含Lib文件会出错的。
显示链接,在应用程序运行的过程中,显示地载入所需的DLL。
一般可以使用LoadLibrary和FreeLibrary来实现加载和卸载DLL。那么如何判断一个DLL是否已经被映射到了进程的地址空间中?我们可以使用GetModuleHandle.
如:
HMODULE hInstDll = GetModuleHandle(TEXT("MyLib"));
if (hInstDll == NULL)
{
hInstDll = LoadLibrary(TEXT("MyLib"));
}
我们已经知道如何显示加载DLL,那如何显示调用其中的变量、函数、类呢?
例如在DLL中,我们有一个变量 g_nResult, 函数Add,我们在执行程序中如何调用呢?可以利用GetProcAddress。
对于变量:
int nResult =*(int*)GetProcAddress(hInstDll, "g_nResult");
对于函数:
typedef int (*FUNC)(int, int);
FUNC pfn = (FUNC)GetProcAddress(hInstDll, "Add");
这是今天学习到的关于DLL的一点知识。
posted on 2009-10-02 16:43
Sandy 阅读(667)
评论(0) 编辑 收藏 引用 所属分类:
windows学习