动态库程序运行时独立存在,不会被链接到可执行程序或动态库中。文件扩展名dll。
1.动态库的制作
1)新建一个Win32项目
2)直接下一步
3)应用程序类型原则DLL
3.新建一个头文件(.h)代码如下:
#ifndef CACULATION_H
#define CACULATION_H
//为了区分是使用 _declspec(dllexport) 还是使用_declspec(dllimport)
//制作动态库应使用 _declspc(dllexport)导出,使用动态库应使用 _declspc(dllimport)
#ifdef DLLCLASS_EXPORTS
#define EXT_CLASS _declspec(dllexport)
#else
#define EXT_CLASS _declspec(dllimport)
#endif
class EXT_CLASS Calculation
{
public:
Calculation();
int add(int num1,int num2);
int sub(int num1,int num2);
~Calculation();
};
extern "C" EXT_CLASS Calculation* GCreateCalculation(); //创建Calculation对象
extern "C" void GDeleteCalculation(Calculation* c); //销毁Calculation对象
#endif
4.新建一个源文件(.cpp)代码如下:
#define DLLCLASS_EXPORTS //制作动态库
#include "Calculation.h"
Calculation::Calculation()
{
}
int Calculation::add(int num1,int num2)
{
return num1 + num2;
}
int Calculation::sub(int num1,int num2)
{
return num1 - num2;
}
Calculation::~Calculation()
{
}
Calculation* GCreateCalculation()
{
return new Calculation();
}
void GDeleteCalculation(Calculation* c)
{
delete c;
}```
# 1.动态库的制作
建立相应的工程,测试代码如下:
```cpp
#include <cstdio>
#include <Windows.h>
#include "..//dynamicLibrary//Calculation.h"
#pragma comment(lib,"..//Debug/dynamicLibrary.lib") //lib文件供动态库函数的映射使用
typedef Calculation* (*pGCreateCalculation)(); //定义函数指针
int main()
{
#if 1
//动态库的隐式调用
Calculation c;
int ret = c.add(5,5);
printf("动态库的隐式调用:%d\n",ret);
#endif
//动态库的显示调用
//1.定义函数指针
//2.使用LoadLibrary函数加载dll模块
//3.获取函数的地址
//4.调用
HMODULE hModule = LoadLibrary("..//Debug/dynamicLibrary.dll");
pGCreateCalculation pFun = (pGCreateCalculation)GetProcAddress(hModule,"GCreateCalculation");
Calculation* c1 = pFun();
ret = c1->add(5,5);
printf("动态库的显示调用:%d\n",ret);
system("pause");
return 0;
}