一. 什么是DLL(动态链接库)?
动态链接库(dynamic-link library)(DLL) 是一个包含函数和数据的模块,它可以被其他模块(应用或 DLL)使用。使用 DLL 也有助于减少内存占用,因为即便每个程序需要拥有属于自己的 DLL 数据的副本,这些程序共享了 DLL 的代码。
二. 如何创建DLL?
2.1 新建dll项目
2.2 代码编写
代码内容引用 https://blog.csdn.net/qq_34097715/article/details/79540933?spm=1001.2014.3001.5506
2.1 创建DLL.h和DLL.cpp
2.2 DLL.h代码编写
测试 隐式调用不需要extern “C” 也可以成功 ,显示调用就需要,否则GetProcAddress获取函数失败,原因为,经过编译器编译后,采用_declspec调用约定对应的函数名修饰规则,对函数名进行了修饰。还没理解透,先跑起来再说。
#pragma once
#ifdef CREATEDELL_API_DU //#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#else //相当于else
#define CREATEDELL_API_DU _declspec(dllimport) //当编译时,头文件不参加编译,所以.cpp文件中先定义,后头文件被包含进来,因此外部使用时,为dllexport,而在内部编译时,则为dllimport
#endif
class CREATEDELL_API_DU animal //需要被外界调用的类(父类)
{
public:
virtual int outDate() = 0; //纯虚函数
void getWide(int x);
void getHigh(int y);
protected:
int wide;
int high;
};
class CREATEDELL_API_DU cat :public animal //需要被调用的类(子类cat)
{
public:
int outDate();
};
class CREATEDELL_API_DU dog :public animal //需要被调用的类(子类dog)
{
public:
int outDate();
};
int CREATEDELL_API_DU exportDate(); //需要被调用的函数(单独的一个函数,不属于任何一个类)
2.2 DLL.cpp代码编写
#include"pch.h" //预编译头文件
#define CREATEDELL_API_DU _declspec(dllexport)
#include <iostream>
#include"DLL.h"
using namespace std;
//父类中函数实现
void animal::getWide(int x) {
wide = x;
}
void CREATEDELL_API_DU animal::getHigh(int y) {
high = y;
}//子类cat中数据输出实现
int CREATEDELL_API_DU cat::outDate() {
return (wide + high); wide += wide; high += high;
}//子类dog数据输出实现
int CREATEDELL_API_DU dog::outDate() {
return (wide - high);
}//函数的实现
int CREATEDELL_API_DU exportDate() {
return 666;
}
2.3 DLL的生成
在这里点击运行会报错!!!!!需要点击生成解决方案.这里就已经创建好DLL了。
2.4 查看生成的文件
Debug文件夹下即为生成的DLL.dll及DLL.lib。
DLL文件夹里即为项目文件.
三. 如何调用DLL?
3.1 DLL调用方法
DLL调用分为隐式链接(需要.lib 和.dll)和显式链接(需要#include <windows.h> 和 .dll)。这篇文章讲隐式链接。下一篇文章讲显示链接。
区别:隐式链接就是在程序开始执行时就将DLL文件加载到内存当中,而显示链接,是实时加载,程序需要的时候加载,不需要的时候,卸载。
3.2 DLL隐式链接
隐式链接,也称为静态加载,是在编译时确定DLL函数地址的过程。这要求DLL在编译时可用,并且链接器会查找所有外部符号引用。这种方式需要DLL文件,以及相应的Lib文件和头文件。
-
创建新项目用于调用DLL,这里创建了Invoke项目,并添加main.cpp。
-
用户引用的时候尽量和导出时的DLL平台一致(X86/X64)。
包含目录:添加.h所在的文件夹
库目录:添加.lib所在的文件夹
链接器->输入->附加依赖项 中添加Dll.lib 或者输入 #pragma comment(lib,“Dll.lib”)
-
main.cpp添加代码,运行会报错,继续往下看第4步。
#include<iostream>
#include"DLL.h"
using namespace std;
bool main()
{
cout << exportDate() << endl; //调用函数输出666
dog dog; //实例化dog对象、赋值、并输出。
dog.getHigh(5);
dog.getWide(6);
cout << dog.outDate() << endl;
cat cat; //实例化cat对象、赋值、并输出
cat.getHigh(16);
cat.getWide(4);
cout << cat.outDate() << endl;
getchar(); //让程序处于等待输入状态下,而不是一闪而过
return 0;
}
- 将Dll.lib放入Invoke项目的Debug目录下。
- 执行结果