我们已经知道 DLL 是包含若干个函数的库文件,应用程序使用 DLL 中的函数之前,
应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义
函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建 DLL 文件时使用模块定
义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用 DEF 文件。下面通过
两个例子来说明如何使用这两种方法创建 DLL 文件。
(1)使用导出函数关键字_declspec(dllexport)创建 DLL
该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。需要生成两
个文件 MyDll.h 和 MyDll.cpp,分别输入代码如下:
//MyDll.h
extern "C" _declspec(dllexport) int Max(int a, int b);
extern "C" _declspec(dllexport) int Min(int a, int b);
//MyDll.cpp
#include "stdafx.h"
#include "MyDll.h"
int Max(int a, int b)
{
if(a >= b)
return a;
else
return b;
}
int Min(int a, int b)
{
if(a >= b)
return b;
else
return a;
}
该动态链接库编译成功后,打开 Ex72 工程中的 debug 目录,可以看到 Ex72.dll、Ex72.lib
两个文件。LIB 文件中包含 DLL 文件名和 DLL 文件中的函数名等,该 LIB 文件只是对应
该 DLL 文件的“映像文件”,与 DLL 文件中,LIB 文件的长度要小的多,在进行隐式链接
DLL 时要用到它。读者可能已经注意到在 MyDll.h 中有关键字“extern C”,它可以使其他
编程语言访问编写的 DLL 中的函数。
(2)使用 DEF 文件
模块定义文件(.DEF)是一个或多个用于描述 DLL 属性的模块语句组成的文本文件,
每个 DEF 文件至少必须包含以下模块定义语句:
· 第一个语句必须是 LIBRARY 语句,指出 DLL 的名字。
· EXPORTS 语句列出被导出函数的名字;将要输出的函数修饰名罗列在 EXPORTS
之下,这个名字必须与定义函数的名字完全一致,如此就得到一个没有任何修饰的
函数名了。
· 可以使用 DESCRIPTION 语句描述 DLL 的用途(此句可选)。
· “;”对一行进行注释(可选)。
为了用.def 文件创建 DLL,先删除上个例子创建的工程中的 MyDll.h 文件,保留
MyDll.cpp 并在该文件头删除#include MyDll.h 语句,同时往该工程中加入一个文本文件,
命名为 MyDll.def,再在该文件中加入如下代码:
LIBRARY "EX72"
DESCRIPTION ’My Win32 Dynamic-Link Library’
EXPORTS
Max @1
Min @2
其中,LIBRARY 语句说明该 def 文件是属于相应 DLL 的,“@”的含义是给函数指定
一个数字序号,这个数字可以被 GetProcAddress()使用。实际上,编译器将给每一个函数指
定一个数字,但是这样每个函数对应的数字不明确,不如自己指定数字。
该 DLL 编译成功后,打开工程中的 Debug 目录,同样也会看到 Ex72.dll、Ex72.lib 两
个文件。
4. 测试 DLL
我们已经完成了 DLL 的创建,下面创建一个简单的测试程序,来调用 DLL 中的两个
函数,是采用隐式链接方式。
在 Visual C++ 6.0 开发环境下,打开 File/New/Project 选项,选择 Win32 Console
Application,并输入项目名称 TestEx72,单击 OK 按钮,在弹出的对话框中选择 A simple
application,然后单击 Finish 按钮完成项目的创建。
将 Ex72.dll 和 Ex72.lib 复制到当前工程所在的目录下面,也可以把 Ex72.dll 复制到
windows 的 System 目录下。
我们可以看到新生成的项目只有一个空的 main函数,下面在 TestEx72.cpp中添加代码,
如下所示:
// TestEx72.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#pragma comment(lib, "Ex72.lib")
extern "C"_declspec(dllimport) int Max(int a,int b);
extern "C"_declspec(dllimport) int Min(int a,int b);
int main(int argc, char* argv[])
{
int min, max;
min = Min(10, 20);
max = Max(10, 20);
printf("最小值为%d/n", min);
printf("最大值为%d/n", max);
return 0;
}
如果 DLL 使用的是 def 文件,要删除函数导入声明前的关键字“extern "C"
编译并运行可得结果!