📄 19.4 完善 win32 dll例子.txt
字号:
19.4 完善 Win32 DLL例子
一个 DLL实现之后,通常都会交给客户程序,以便后者能访问该 DLL。但是客户端程序如何知道该 DLL中有哪些导出函数呢?对上述 DllTest例子来说,因为该程序使用的动态链接库: Dll1. dll是我们自己编写的,所以我们清楚该 DLL中的导出函数。如果 DLL程序的实现者和使用者不是同一个人,那么后者只能通过前面介绍的一些工具来查看该 DLL提供的导出函数,井猜测这些函数的原型。这种做法对 DLL的调用不是很方便。通常在编写动态链接库时,都会提供一个头文件,在此文件中提供 DLL导出函数原型的声明,以及函数的有关注释文档。
接下来,我们就为 DLL1工程添加一个头文件: Dlll.h ,井在其中添加下述例 19-7所示代码。
例 19-7
_declspec(dllimport) int add(int a , int b);
_declspec (dllimport) int subtract (int a , int b);
读者应注意,这里我们在 Dll1工程中增加的头文件: Dl1l.h是给该 DLL的客户端,即调用该 DLL的程序使用的,因此在声明 add和 subtract这两个函数时,使用的是 " dllimport"关键字,向客户程序表明它们是从动态链接库中导入的。
然后,在测试程序 Dl1Test中,将 DllTestDlg.cpp文件中先前添加的 add和 subtract这
两个函数的声明语句〈即如例 19-6所示代码〉注释起来,井在该文件的前部添加下面这条语旬,以包含 dll1 .h文件。
#include ".. \Dll1\Dll1.h"
提示:读者应注意 Dll l.h文件的路径。
Build并运行 DllTest程序,然后分别单击对话框窗口上的【 Add】和【 Subtract】按钮,将会发现程序运行结果是一样的。通过上述方法,在发布 Dll l. dll动态链接库的同时,可以将 Dlll.h这个头文件一起提供给使用者。下面,我们对 Dll l. h进行改造,使其不仅能够为调用动态链接库的客户端程序服务,同时也能够由动态链接库程序自身来使用。改造后的 Dll l.h文件内容如例 19-8所示。
例 19-8
#ifdef DLLl API #else #def工 ne DLLl_API _declspec(dllimport ) #endif
DLLl AP工工nt add(工nt a,工nt b); DLLl_API工 nt subtract(int a,工nt b) ;
在该文件中,首先使用条件编译指令判断是否定义了 DLL1 API符号,如果己经定义了该符号,那么不作任何处理:否则定义该符号,将其定义为:一dec1spec ( dllimport )。然后使用所定义的 DLL1 API宏来代替 add函数和 subtract函数声明前面的_dec1spec ( dllimport )标识符。
接下来,在动态链接库的源程序: Dll1叩p文件中,首先利用 #define指令定义 DLL1 API宏,然后利用 #in c1ude指令包含 Dll l. h文件。之后,在定义 add和 subtract函数时不再需要指定_declspec ( dllexport )标识符了,所以将其删除,这时的 Dll l.cpp文件的
内容如例 19-9所示。
19IJ 19-9
#define DLLl_API _declspec(dllexport )
#include "Dlll.h"
int add(int a , int b)
return a+b ;
int subtract(int a , int b)
return a-b ;
前面已经介绍过,在程序编译时,头文件不参与编译,源文件单独编译。因此,在编译 Dlll .cpp文件时,首先定义 DLLLAPI宏,将其定义为:一dec1 spec (dllexport)。然后包含 Dlll.h这一头文件,这将展开该头文件。展开之后,首先判断 DLL1 API是否己经定义了。因为这时已经定义了这个宏,所以不再定义该宏,直接编译其后的 add和 subtract函数的声明。因为在声明这两个函数时,都使用了 DLL1 API宏,而且这时该宏的定义是: _dec1spec ( dl1export),表明这两个函数是动态链接库的导出函数。
之后,将这个 DLL交由其他程序使用时,只要后者没有定义 DLL1 API宏,那么该宏的定义就是: _dec1spec (dllimport),即 add和 subtract函数是导入函数。通过上述方法, Dll1 .h这个头文件既可以由实现 DLL的程序使用,也可以由调用该 DLL的客户端程序使用。
读者可以将重新生成的 Dl11.1 ib和 Dll l. dll文件复制到 DllTest工程所在目录下。然后运行最新的 DllTest程序,可以发现结果也是正确的。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -