在学习注入dll时候 一直不理解如何区分动态链接库和静态链接库
今天让我们自己写程序将它理解清楚
首先我们打开vs
创建一个动态链接库文件
下面就是创建完文件之后 生成的代码
我们在动态链接库的入口处写入自己的函数
自己动手写一个dll导出函数
#include "pch.h"
// _declspec(dllexport) 声明导出函数将该函数从该dll开放提供给其他函数使用
extern "C" _declspec(dllexport) void ccc();
void ccc() {
MessageBox(NULL,"导出函数被调用成功","信息:",MB_YESNO);
}
//api信息框 来查看是否调用成功
//动态链接库的入口函数
BOOL APIENTRY DllMain( HMODULE hModule, //DLL模块的句柄
DWORD ul_reason_for_call, //DLL被调用的原因
LPVOID lpReserved //保留项也是Windows的保留参数
) //保留参数不是不使用的参数,而是Windows不想让我们知道
//作用的参数
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //当进程加载时 DLL被调用
case DLL_THREAD_ATTACH: // 有线程被创建时DLL被调用
case DLL_THREAD_DETACH: //有线程结束时DLL被调用
case DLL_PROCESS_DETACH: //当DLL被进程卸载时DLL被调用
break;
}
return TRUE;
}
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这
部分代码按C语言(而不是C++)的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的
参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不
会带上函数的参数类型,一般只包括函数名。
这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,