关闭

动态链接库的建立与测试

383人阅读 评论(0) 收藏 举报

我们已经知道 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.dllEx72.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.dllEx72.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"

编译并运行可得结果!

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:152151次
    • 积分:2143
    • 等级:
    • 排名:第18379名
    • 原创:56篇
    • 转载:37篇
    • 译文:0篇
    • 评论:17条