动态链接库的建立与测试

原创 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"

编译并运行可得结果!

 

windows下创建并使用动态链接库(.dll)

定义: 动态链接库(dll)是一个包含可由多个程序同时使用的代码和数据的库。动态链接库不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数或是...
  • EmSoftEn
  • EmSoftEn
  • 2016年04月09日 15:08
  • 678

vs2013创建和使用动态链接库

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,并提出了与实现相关的几个问题,供初学者交流。 本文包含以下内容: 创建动态链接库项目 向动态链接库添加类 ...
  • qinzhenhua100
  • qinzhenhua100
  • 2017年03月19日 21:08
  • 637

动态链接库DLL的创建和使用

这里总结一下vs下创建dll并使用dll导出函数的方法,当然方法还有很多,找出一个自己比较习惯的方法就好! 隐式加载DLL方式 创建DLL工程       文件->新建->项目-...
  • zhengsx77
  • zhengsx77
  • 2014年02月10日 11:23
  • 2987

vs2010 创建和C#使用动态链接库(dll)

一、VS 用 C++ 创建动态链接库 Step 1:创建Win32 Console Application 本例中我们创建一个叫做“Test”的Solution。 Step ...
  • bigpudding24
  • bigpudding24
  • 2016年02月29日 10:01
  • 1884

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

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

使用VS2015 创建C++动态链接库并调用

由于毕业设计要用到C++动态链接库的创建,看了很多博客之后,实现了这个功能。现在简单介绍一下。 一:创建C++的DLL工程文件 1.新建c++项目,win32控制台程序,命名为:MyDLL,解决方...
  • dearKundy
  • dearKundy
  • 2017年06月16日 16:00
  • 3467

静态链接库与动态链接库区别

一、        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使...
  • u011404663
  • u011404663
  • 2016年02月25日 18:19
  • 1969

windows下动态链接库的使用(实例)

一、生成DLL   1.       新建DLL工程 在VS中,新建一个空的项目,选Win32 Console Application,新建完后修改工程属性:把生成EXE改为生成DLL   2.   ...
  • s651665496
  • s651665496
  • 2015年08月05日 12:45
  • 661

Linux动态链接库的建立

hello.c   1#include "hello.h"   2 void hello()   3 {   4     printf("hello\n");   5 } hello....
  • creater2009
  • creater2009
  • 2011年11月02日 14:14
  • 764

Linux下Opencv整合QtCreator

QT是很不错的跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。 很显然,在 Lin...
  • second_to_none
  • second_to_none
  • 2014年07月21日 10:44
  • 633
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态链接库的建立与测试
举报原因:
原因补充:

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