动态链接库
动态链接库就是大家俗称的DLL文件,在windows系统中非常常见,是一个可以被其他程序共享的功能模块。动态连接库是不能直接执行的,它只能作为导出函数,被其他exe文件调用,一般我们都会说“导入/加载动态链接库”。
导出函数
刚才说到了一个导出函数的概念,导出函数一般跟内部函数进行比较,内部函数就是在这个文件中内部定义的函数,只能这个文件来调用。而导出函数是在这个文件中定义,这个文件能够使用,但是别的文件也是同样可以使用的。
动态链接库编程
动态链接库,顾名思义,是当程序执行的时候需要用到一些导出函数的时候才加载DLL文件,并且在使用之后会卸载掉,意味着可以节省内存。
在我们进行动态链接库编程的时候,首先需要编写DLL文件,可以用IDE新建一个动态链接库的项目,会自动生成一个DLLMain.cpp文件,里面有定义好的模版。
1 | BOOL APIENTRY DllMain( HMODULE hModule, |
其中DLL_PROCESS_ATTACH
是加载到内存的时候执行,DLL_THREAD_ATTACH
是进程中有线程时执行,DLL_THREAD_DETACH
是进程中线程被结束的时候执行,DLL_PROCESS_DETACH
是从内存中卸载的时候执行。
我们想要定义自己的导出函数的话,就在main函数的上面或者下面都可以
1 | #include "stdafx.h" |
写好了定义的代码,我们还需要新建一个模版定义文件,是.def
后缀的文件,其中声明要导出的函数名称
1 | EXPORTS |
然后我们进行编译,就会得到dll文件了。
之后我们新建一个.c文件,定义main函数,来加载我们编译好的动态链接库文件。
1 | #include <stdio.h> |
代码中我们必须要先定义好我们需要引用的函数原型,在main函数中,使用LoadLibrary函数加载DLL文件,该函数会返回一个DLL文件的句柄,然后使用GetProcAddress获取导出函数的地址,其参数是之前返回的句柄,以及导出函数的名称。最后调用导出函数即可。当然了,最后不要忘记用FreeLibrary函数将句柄清空。
1 | gcc dllp.c -o dllp |
编译之后执行可执行文件即可发现有弹窗。