Windows三个重要的DLL:
n Kernel32.dll:管理内存、进程、线程
n User32.dll:执行用户界面(窗口创建和消息传送)
n GDI32.dll:画图和文本显示。
特殊DLL:
n AdvAPI32.dll:安全、注册表、事件记录
n ComDlg32.dll:常用对话框
n ComCtl32.dll:常用窗口控件
DLL的特殊目的:Windows某些特性只能为DLL使用:
n 安装挂钩(SetWindowsHookEx,SetWinEventHook)
n COM
n ActiveX
创建DLL模块:
发行DLL(给客户使用其中的函数)时要分发的文件:.h, .lib, .dll。
发行EXE模块(给客户运行)时要分发的文件:.dll。
一、头文件格式:
/*************************************************************************
Module :MyLib.h
// Module Name; Purpose; Date; Edition
*************************************************************************/
#ifdef MYLIBAPI
// MYLIBAPI 要在可执行文件的头部定义
// 你的函数,变量申明
#else
// 这里是使用DLL模块的模式
#define MYLIBAPI extern “C” __declspec(dllimport)
#endif
// 在这里定义数据结构和符号。
// 定义输出变量(尽量避免输出变量)
MYLIBAPI int g_nResult;
// 输出函数的申明
MYLIBAPI int MyFunc(int n);
/ end of file ///
二、源文件格式:
/*************************************************************************
Module :MyLib.cpp
// Module Name; Purpose; Date; Edition
*************************************************************************/
// 包含你需要的头文件
#include<windows.h>
// 定义宏的位置
// 在包含头文件之前,及任何函数、变量定义之前 定义宏
#define MYLIBAPI extern “C” __declspec(dllexport)
// 包含头文件
#include “mylib.h”
// 代码
int g_nResult;
int MyFunc(int n){ return n; }
/ end of file ///
三、Mircrosoft编译器会修改函数名,如上面的函数的输出节中名字会是:_ MyFunc @4。若要使其它编译器能够使用你的库,有两个方法(建议使用第一种):
a) 为编程项目建立.def文件,加上类似下面的EXPORTS节,就会输出未修改过的函数名:
EXPORTS
MyFunc
b) 也可以在DLL源代码模块中,添加下面代码:
#pragma comment(linker, “/export:MyFunc=_MyFunc@4”)
四、VC的DumpBin.exe(查看MSDN)程序可以查看有哪些节,以及哪些输入、输出节,模块列表,输入符号列表等。(RVA这一列指明在DLL文件映像中的什么位置能够找到输出符合的位移量)
五、加载程序搜索DLL的顺序:(下一节将介绍在如何改变搜索顺序)
a) 包含可执行文件的目录
b) 进程的当前目录
c) Windows系统目录
d) Windows目录
e) PATH环境变量中列出的各个目录