动态链接库(DLL)总结---简单使用(2)
来源:互联网 发布:格拉夫红牌伏特加 知乎 编辑:程序博客网 时间:2024/06/05 05:42
接着《动态链接库(DLL)总结---简单使用(1)》我们来完善dll项目。为什么说是要完善DLL项目呢?在实际开发中,一个DLL实现后,通常会交给客户程序,以便后者能够调用。客户程序需要知道DLL导出了那些函数和函数原型,有人说我们在上篇文章是知道的啊,之所以知道是因为程序都是我们自己写的。如果我们自己使用别人编写的dll呢?那么我们可以使用一些工具来知道导出了那些函数和函数的原型,但是这样就不是很方便。通常在编写动态链接库的时候,会提供一个头文件,此文件中提供了导出了那些函数,以及函数的相关注释。
我们将上例中的 MyDllOne.h 文件改写如下:
#ifdef DLL1_API_IMP #else#define DLL1_API_IMP __declspec(dllimport)#endifDLL1_API_IMP int add(int a, int b);DLL1_API_IMP int sub(int a, int b);这里使用的是条件编译选项判断是否定义了DLL1_API_IMP符合,如果定义了该符合,则不做任何的操作;否则,将其定义为 __declspec(dllimport),然后用定义的__declspec(dllimport)去替换函数add 和 sub前面的DLL1_API_IMP。
MyDllOne.cpp文件改写如下:
#include "stdafx.h"#define DLL1_API_IMP __declspec(dllexport)#include "MyDllOne.h"int add(int a, int b){return (a + b);}int sub(int a, int b){return (a - b);}我们在 MyDllOne.cpp文件中,首先定义DLL1_API_IMP宏,然后在导入MyDllOne.h文件。为什么要这么做呢?在程序编辑的时候,头文件不参与编译,源文件单独编译。因此,在编译MyDllOne.cpp文件的时候,首先定义了DLL1_API_IMP宏,将其定义为__declspec(dllexport)。然后在导入MyDllOne.h文件,展开头文件后,先判断是否定义了DLL1_API_IMP宏,发现定义了就不会再定义DLL1_API_IMP宏了,而是直接编译cpp后面的内容。
当我们生成dll文件后,交给其他程序使用的时候,只要后者没有定义DLL1_API_IMP宏,就会将DLL1_API_IMP宏定义为 __declspec(dllimport)。
这样我们就可以实现,.h头文件既可以由dll编写程序使用,也可以供调用该dll的程序使用。
我们将重新生成的 MyDllOne.h、MyDllOne.dll 和 MyDllOne.lib文件拷贝到window控制台测试项目目录下,代码如下:
#include "stdafx.h"#include <Windows.h>#pragma comment(lib,"DLL1.lib")#include "DLL1.h"int _tmain(int argc, _TCHAR* argv[]){ printf("4+3 = %d \n", add(4, 3)); printf("4-3 = %d \n", sub(4, 3));system("pause");return 0;}
0 0
- 动态链接库(DLL)总结---简单使用(2)
- 动态链接库(DLL)总结---简单使用(1)
- 动态链接库(DLL)总结---动态链接库的创建与使用(5)
- 动态链接库(DLL)简单了解
- 动态链接库(DLL)总结
- 动态链接库(DLL)总结
- 动态链接库(DLL)总结
- 动态链接库(DLL)总结---静态链接库的创建与使用(4)
- 动态链接库(DLL)总结---DLL注入(9)
- 动态链接库(DLL)的使用
- 使用动态链接库(DLL)
- 动态链接库(dll) 使用
- 使用VS2010建立一个简单的DLL(动态链接库)实例
- 动态链接库(DLL)总结---编译选项中使用名称粉碎机制(7)
- 编写DLL(动态链接库)的简单流程
- dll入门简单实例(动态链接库)
- 动态链接库 简单的DLL (转载)
- dll动态链接库简单入门
- (解题报告)HDU1020---Encoding
- 人脸检测特征-haar特征
- 浅析 Linux 初始化 init 系统,第 2 部分: UpStart
- 文件太大?来试试分卷压缩
- java import机制(不用IDE)
- 动态链接库(DLL)总结---简单使用(2)
- 10.30-11.6之所学
- Reactor VS Proactor 模式
- 人脸检测特征-LBP特征
- simhash_1
- js弹出层
- HDU - 1166 地兵布阵
- winapi->WSAGetOverlappedResult
- VBS自学(四)