动态链接库的建立与测试

原创 2007年09月22日 11:10:00

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

编译并运行可得结果!

 

相关文章推荐

动态链接库测试程序

  • 2015年07月24日 17:25
  • 10.34MB
  • 下载

【原】基于vc 6.0开发dll动态链接库和测试实例--串口操作

【原】基于vc 6.0开发dll动态链接库和测试实例--串口操作   公司突然下达指令,让我这个从没用过vc的人开发一个接口函数,对接方又比较蛋疼,指定要求将接口封装到dll中进行使用,以下是使用...

win32 动态链接库及测试程序

  • 2015年01月20日 16:21
  • 2.07MB
  • 下载

C++动态链接库测试实例

前话上一章节我导出了一个动态链接库要使用该链接库,我们还需要该链接库对外公开的函数,即头文件下面开始实例测试实例第一步——将动态链接库的dll、lib、和头文件导入项目中文件目录如下:项目目录如下:第...
  • pwc1996
  • pwc1996
  • 2015年12月08日 15:08
  • 482

动态链接库的建立与调用

  • 2012年05月10日 14:59
  • 520KB
  • 下载

VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,只是项目及文件名称不同。创建动态链接库项目:...

Delphi中动态链接库(DLL)的建立和使用

动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态链接库的建立与测试
举报原因:
原因补充:

(最多只允许输入30个字)