练习dll库的创建与使用
一、创建dll库
1.1、新建项目–“Win32项目”
1.2、应用程序类型选择DLL,并选择空项目创建
1.3、添加源文件与头文件
/* myDLL.h */
#pragma once;
#ifdef DLL_IMPLEMENT
#define DLL_API _declspec(dllexport) //在生成dll的项目中为dllexport
#else
#define DLL_API _declspec(dllimport) //在调用该dll的项目中为 dllimport
#endif
extern "C" DLL_API int add(int a, int b, int c);
//extern "C"是解决C与C++的兼容问题
/* myDLL.cpp */
#define DLL_IMPLEMENT
#include<windows.h>
#include<stdio.h>
#include"myDLL.h"
/* 求和函数的实现 */
extern "C" DLL_API int add(int a, int b, int c)
{
return a + b + c;
}
/* DLL_API 该宏定义在头文件中 */
/* extern "C" 告诉编译器按C语言规则编译 */
1.4、修改编译器选项
1.5、生成解决方案
在x64/Release文件夹下可以看到生成的库文件
二、调用DLL库
2.1、新建项目–“Win32控制台应用程序”
2.2、添加源文件、头文件
/* callDLL.cpp */
#include"myDLL.h"
#include<stdio.h>
#pragma comment(lib,"myDLL.lib")
int main() {
int sum = add(1, 2, 3); //调用求和函数
printf("调用DLL求和结果:%d", sum);
getchar();
return 0;
}
头文件拷贝myDLL.h过去使用。
2.3、添加DLL、LIB库文件
- 在x64/Debug文件夹下,添加所要调用的dll文件。若是找不到x64/Debug,可以先“生成解决方案”,会自动创建该文件夹。
点击“生成解决方案”,报错,但是会自动创建x64/Debug文件夹。
然后在该文件夹下添加DLL文件。
在头文件与源文件目录下添加LIB文件。
2.4、调试运行
CTRL+F5调试运行。
三、小结
3.1、创建DLL库的方法
- 两种方法区别在于export(导出)方法不同。
- 第一种:.cpp与.h
使用宏定义规定导出的变量、函数的格式,如在头文件中定义了宏DLL_IMPLEMENT:
#ifdef DLL_IMPLEMENT
#define DLL_API _declspec(dllexport) //在生成dll的项目中为dllexport
#else
#define DLL_API _declspec(dllimport) //在调用该dll的项目中为 dllimport
#endif
接着,在声明和定义时都得使用该宏,如在头文件声明时:
extern "C" DLL_API int add(int a, int b, int c);
在源文件定义时:
/* 求和函数的实现 */
extern "C" DLL_API int add(int a, int b, int c)
{
return a + b + c;
}
/* DLL_API 该宏定义在头文件中 */
/* extern "C" 告诉编译器按C语言规则编译 */
- 第二种:.cpp、.h、.def(不常用)
不使用导出符号,而是使用导出文件(.def)。你可以在DLL工程中,添加一个Module-Definition File(.def)文件。.def文件为链接器提供了有关被链接器程序的导出、属性及其它方面的信息。
3.2、调用DLL库的方法
- 隐式导入
加入 #pragma comment(lib, “xxx\xxx.lib”),比如上面的例子:
#pragma comment(lib,"myDLL.lib")
- 显式导入
先放置好dll文件,之后LoadLibrary载入dll
getProcAddress获取dll 接口 使用函数指针指向该接口,使用函数指针指向该指针
释放dll FreeLibray(HMODULE)