什么是动态链接库
动态链接库(DLL) 是一个包含函数和数据的模块,它可以被其他模块(应用或 DLL)使用
创建动态链接库
直接用vs2019的动态链接库进行项目创建,把编译器创建的头文件和源文件删掉,自己新建一个.cpp和.h文件
与静态链接库不同的是,动态链接库不仅有.lib文件,还有.dll文件。在静态链接库中,代码放在.lib文件中;而动态链接库把真正的代码放在.dll文件中,.lib文件用来存储代码的函数地址
同样,设置为不使用预编译头
生成代码
把.dll文件和.lib文件以及.h拷贝给新创建的空项目MyDll1_Call
隐式调用
将 #pragma comment(lib,“DLL名.lib”) 添加到调用项目的源程序中;运行程序
#include <stdio.h>
#include "MyDll.h" //将.h文件复制到目录下则可用该条语句,include了则不需要再声明dll中的函数
#pragma comment(lib,"Dll1.lib") //若是在资源文件中在添加现有项把.lib和.dll加进去则不用该行代码
int main(int argc, char* argv[])
{
int x = Plus(1,2);
printf("%d\n",x);
return 0;
}
显式调用
#include <stdio.h>
#include <Windows.h>
//步骤1 定义函数指针
typedef int(_stdcall* lpPlus)(int, int);
typedef int(_stdcall* lpSub)(int, int);
typedef int(_stdcall* lpMul)(int, int);
typedef int(_stdcall* lpDiv)(int, int);
int main(int argc, char* argv[])
{
//步骤2 声明函数指针变量
lpPlus myPlus;
lpSub mySub;
lpMul myMul;
lpDiv myDiv;
//步骤3 动态加载dll到内存中
HINSTANCE hModule = LoadLibraryA("Dll1.dll");
//步骤4 获取函数地址
myPlus = (lpPlus)GetProcAddress(hModule, "_Plus@8"); //若没加_stdcall,名字应改成Plus
mySub = (lpSub)GetProcAddress(hModule, "_Sub@8");
myMul = (lpMul)GetProcAddress(hModule, "_Mul@8");
myDiv = (lpDiv)GetProcAddress(hModule, "_Div@8");
int x1 = myPlus(5, 1);
int x2 = mySub(5, 1);
int x3 = myMul(5, 1);
int x4 = myDiv(5, 1);
printf("%d\n", x1);
printf("%d\n", x2);
printf("%d\n", x3);
printf("%d\n", x4);
return 0;
}