dll文件编写
DLL文件,即动态链接库文件,在windows中许多pe文件运行时需要将一些dll文件加载进内存,从而调用dll文件里的内容。
DLLMAIN
dllmain,是dll在被加载时执行的函数(dllmain在dll文件中不是必须的)
BOOL WINAPI DLLMain( |
其中,载入状态有四种,如下
DLL_PROCESS_ATTACH:进程进入时
DLL_PROCESS_DETACH:进程退出时
DLL_THREAD_ATTACH:线程进入时
DLL_THREAD_DETACH:线程退出时
dllmain根据载入状态的不同,可以做出不同的反应。就像这样
#include <iostream> |
DLL 导出函数
dll编写时,要用__declspec关键字标明哪些函数是要导出的,_
__declspec(dllexport) 用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,像这样
extern "C" int _declspec(dllexport) go() { |
这样就设置好一个用于导出的函数了。
题外话:怎么使用dll或lib中的导出函数
对于lib(静态链接库)来说,使用静态链接 dll(动态链接库)来说使用动态链接
静态链接
又叫隐式链接。链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件),所以组成的exe文件体积较大
|
动态链接
又叫显示链接,将一些api函数写入到一个dll文件中,在程序在程序运行时再加载到程序的进程空间中使用,这样可以让运行程序本身体积较小,方便模块化编程。
int TestDLL() |
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) { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.