DLL文件,即动态链接库文件,在windows中许多pe文件运行时需要将一些dll文件加载进内存,从而调用dll文件里的内容。

DLLMAIN

dllmain,是dll在被加载时执行的函数(dllmain在dll文件中不是必须的)

BOOL WINAPI DLLMain(
//指向自身句柄
_In_HINSTANCE hinstDLL,
//载入状态
_In_DWORD fdwReason,
//加载方式(隐式、显式)
_In_LPVOID IpvReserved
);

其中,载入状态有四种,如下

DLL_PROCESS_ATTACH:进程进入时

DLL_PROCESS_DETACH:进程退出时

DLL_THREAD_ATTACH:线程进入时

DLL_THREAD_DETACH:线程退出时

dllmain根据载入状态的不同,可以做出不同的反应。就像这样

#include <iostream>

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
std::cout << "Process attach. \n";
break;
case DLL_PROCESS_DETACH:
std::cout << "Process exit. \n";
break;
case DLL_THREAD_ATTACH:
std::cout << "Thread attach. \n";
break;
case DLL_THREAD_DETACH:
std::cout << "Thread exit. \n";
break;
}
return TRUE;
}

DLL 导出函数

dll编写时,要用__declspec关键字标明哪些函数是要导出的,_

__declspec(dllexport) 用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,像这样

extern "C" int _declspec(dllexport) go() {
std::cout<<"gogo"
}

这样就设置好一个用于导出的函数了。

题外话:怎么使用dll或lib中的导出函数

对于lib(静态链接库)来说,使用静态链接 dll(动态链接库)来说使用动态链接

静态链接

又叫隐式链接。链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件),所以组成的exe文件体积较大


#pragma comment(lib,"testDLL.lib") //在此处通过静态链接,此之前把生成的lib文件放入loadDLL工程文件夹下面,并设置编译器的附加依赖项中增加此lib
extern "C"_declspec(dllimport) int go(); //声明函数

int main(){
go();
}

动态链接

又叫显示链接,将一些api函数写入到一个dll文件中,在程序在程序运行时再加载到程序的进程空间中使用,这样可以让运行程序本身体积较小,方便模块化编程。

int TestDLL()

{

HMODULE hModule = NULL;

typedef int (*Func)(int a, int b);

// 动态加载 DLL 文件
hModule = LoadLibrary(_TEXT("..//Debug//FuncDll.dll" ));

// 获取 fun函数地址
Func fAdd = (Func)GetProcAddress(hModule, "fun" );

// 使用函数指针
printf("%d/n" , fAdd(3, 1));

// 释放指针
FreeLibrary(hModule);
return 0;

}

rundll32

用rundll32.exe 可以执行dll中的某一导出函数

但是不是所有函数都能通过rundll32调用,函数必须符合如下定义

VOID CALLBACK FunctionName (HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,INT nCmdShow);

这里随便写了个

extern "C" __declspec(dllexport) void rundll(HWND hwnd, HINSTANCE hinst, LPTSTR lpCmdLine, INT nCmdShow) {

MessageBox(NULL, TEXT("-Test-"), TEXT("Rundll32"), MB_OK);

}

image-20210301194831320