滴水逆向——VS2017编译&调用DLL
I.静态链接库
1.创建静态链接库:
a.在VC6中创建项目:Win32 Static Library
b.在项目中创建两个文件:xxx.h 和 xxx.cpp
c.编译
2.使用静态链接库:
方式一:
将xxx.h 和 xxx.lib复制到要使用的项目中
在需要使用的文件中包含:#include "xxx.h"
在需要使用的文件中包含:#pragma comment(lib, "xxx.lib")
方式二:
将xxx.h 和 xxx.lib复制到要使用的项目中
在需要使用的文件中包含:#include "xxx.h"
3.静态链接库缺点:
使用静态链接生成的可执行文件体积较大,造成浪费
我们常用的printf、memcpy、strcpy等就来自这种静态库
Ⅱ.DLL
1.创建DLL
a.源文件中:
b.头文件中 :
说明:
1)extern 表示这是个全局函数,可以供各个其他的函数调用;
2)"C" 按照C语言的方式进行编译、链接
__declspec(dllexport)告诉编译器此函数为导出函数;
2.使用DLL
方式一:隐式连接
步骤1:将 *.dll *.lib 放到工程目录下面
步骤2:将 #pragma comment(lib,"DLL名.lib") 添加到调用文件中
步骤3:加入函数的声明
extern "C" __declspec(dllimport) __stdcall int Plus (int x,int y);
extern "C" __declspec(dllimport) __stdcall int Sub (int x,int y);
extern "C" __declspec(dllimport) __stdcall int Mul (int x,int y);
extern "C" __declspec(dllimport) __stdcall int Div (int x,int y);
说明:
__declspec(dllimport)告诉编译器此函数为导入函数;
方式二:显示链接
步骤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);
步骤2: //声明函数指针变量
lpPlus myPlus;
lpSub mySub;
lpMul myMul;
lpDiv myDiv;
步骤3: // //动态加载dll到内存中
HINSTANCE hModule = LoadLibrary("DllDemo.dll");
步骤4: //获取函数地址
myPlus = (lpPlus)GetProcAddress(hModule, "[email protected]");
mySub = (lpSub)GetProcAddress(hModule, "[email protected]");
myMul = (lpMul)GetProcAddress(hModule, "[email protected]");
myDiv = (lpDiv)GetProcAddress(hModule, "[email protected]");
步骤5: //调用函数
int a = myPlus(10,2);
int b = mySub(10,2);
int c = myMul(10,2);
int d = myDiv(10,2);
Ⅲ.VS2017编译&调用DLL
VS2017编译DLL
1.创建一个新项目,点击动态链接库
2.添加头文件Dll1Test.h,并在源文件Dll1Test.cpp中写上自己要打包成Dll的函数
3.点击重新生成解决方案,并成功生成
4.点击Debug,里面即是所生成的.dll文件以及lib文件。至此,dll文件的创建已经完成
VS2017调用DLL
1.新建项目
2.把“Dll1Test.dll”、“Dll1Test.lib”和“Dll1Test.h”放到如图的文件夹里面
3.添加一个新建项“Dll1Use.cpp”,里面添加如下代码
4.添加" Dll1Test.lib"到资源文件
5.点击“重新生成解决方案”,成功。执行如下