在C++中调用DLL中的函数(2)

本文转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html
 

应用程序使用DLL可以采用两种方式:

一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。

Visual C++6.0VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL

1.包含EXE文件的目录,

2.进程的当前工作目录,

3Windows系统目录,

4Windows目录,

5.列在Path环境变量中的一系列目录。

1.隐式链接

  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。

隐式链接 采用静态加载的方式,比较简单,需要 .h .lib .dll 三件套。新建 控制台应用程序 空项目 。配置如下 :

项目->属性->配置属性->VC++ 目录-> 包含目录里添加头文件Mydll.h所在的目录 
项目->属性->配置属性->VC++ 目录-> 库目录里添加头文件Mydll.lib所在的目录 
项目->属性->配置属性->链接器->输入-> 附加依赖项里添加“Mydll.lib”(若有多个 lib 则以空格隔开)
下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为testDLL,在testDLL.h、testDLL.cpp文件中分别输入如下代码:

 //testDLL.h

#pragma comment(lib,"MyDll.lib")
extern  " C "_declspec(dllimport)  int Max( int a, int b);
extern  " C "_declspec(dllimport)  int Min( int a, int b);
// TestDll.cpp
#include
#include " Dlltest.h "
void main()
{ int a;
a=min( 8, 10)
printf( " 比较的结果为%d\n ",a);
}

 在创建DllTest.exe文件之前,要先将MyDLL.dllMyDLL.lib拷贝到当前工程可执行文件所在的目录下面(非常重要),也可以拷贝到windowsSystem目录下。如果DLL使用的是def文件,要删除testDLL.h文件中关键字extern "C"。testDLL.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib"MyDLL.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

2.显式链接

  显式链接是应用程序在执行过程中随时可以加载 DLL 文件,也可以随时卸载 DLL 文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用 LoadLibrary MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用 GetProcAddress() 获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用 FreeLibrary MFC 提供的 AfxFreeLibrary 释放动态链接库。下面是通过显式链接调用 DLL 中的 Max 函数的例子。

 #include

#include
void main( void)
{
typedef  int(*pMax)( int a, int b);
typedef  int(*pMin)( int a, int b);
HINSTANCE hDLL;
PMax Max
HDLL=LoadLibrary( " MyDll.dll "); // 加载动态链接库MyDll.dll文件;
Max=(pMax)GetProcAddress(hDLL, " Max ");
A=Max( 5, 8);
Printf( " 比较的结果为%d\n ",a);
FreeLibrary(hDLL); // 卸载MyDll.dll文件;
}

 

 

 

在上例中使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针,然后通过LoadLibray()DLL加载到当前的应用程序中并返回当前DLL文件的句柄,然后通过GetProcAddress()函数获取导入到应用程序中的函数指针,函数调用完毕后,使用FreeLibrary()卸载DLL文件。在编译程序之前,首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。

 

  使用显式链接应用程序编译时不需要使用相应的 Lib 文件。另外,使用 GetProcAddress() 函数时,可以利用 MAKEINTRESOURCE() 函数直接使用 DLL 中函数出现的顺序号,如将 GetProcAddress(hDLL,"Min") 改为 GetProcAddress(hDLL, MAKEINTRESOURCE(2)) (函数 Min() DLL 中的顺序号是 2 ),这样调用 DLL 中的函数速度很快,但是要记住函数的使用序号,否则会发生错误。

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/woshitianma/p/3681512.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值