动态链接库(DLL)的制作与使用

DLL实际上是一个能够被其他程序加载的、能够实现某些功能的程序
user32.dll 界面相关
kernel32.dll 进程相关

DLL的意义
1)每个程序有自己的4GB空间,2GB用来存放系统内核的DLL,那么剩下的2GB自然要省着用,DLL的好处在于用的时候加载到内存空间,用完毕可以释放占用的内存,达到一种节省内存的目的。
2)功能函数的独立、自由调用

DLL的编写、调用
① 新建Win32项目,选择DLL,其入口主函数为dllmain.cpp
动态链接库(DLL)的制作与使用_第1张图片

② 新建一个Win32控制台程序来调用上述DLL文件,需要用到windows.h库,调用的方法很简单可以直接用::loadLibrary来调用,参数为DLL的名字。
动态链接库(DLL)的制作与使用_第2张图片

③ 由于DLL被加载的时候会触发DLL入口主函数的ATTACH条件,因此在DLL主函数中可以加入一个MessageBox进行提示。
动态链接库(DLL)的制作与使用_第3张图片

点击生成一下该程序,然后在LoadDllDemoo工程右键调试生成新实例
动态链接库(DLL)的制作与使用_第4张图片

关闭程序提示如下
动态链接库(DLL)的制作与使用_第5张图片

同时看到生成了DLL文件
动态链接库(DLL)的制作与使用_第6张图片

可以测试一下如果将DLL文件移除掉,同时程序提示加载DLL文件失败,在LoadDllDemo.cpp中编写如下
动态链接库(DLL)的制作与使用_第7张图片

注意调试之前先把生成的CreateDllDemo.dll干掉,比如移动到一个别的文件夹,然后点击调试调用,可以看到加载DLL失败
动态链接库(DLL)的制作与使用_第8张图片

这里需要了解下LoadLibrary的加载DLL的顺序,首先在当前目录下找,然后到C盘的system32目录、SysWOW64目录下找。因为系统是64位的。也就是说可以把刚才的DLL放到system64目录下,同样能够成功加载(这可以叫做重定向)。
动态链接库(DLL)的制作与使用_第9张图片

到这里为止关于DLL的调用就简单演示了一下,但并非DLL的关键,DLL的核心在于导出函数与导入函数,DLL作为一个模块来说,是要实现功能的。
下面新建一个Win32的DLL项目,用来实现功能(导出符号为可选)
动态链接库(DLL)的制作与使用_第10张图片

生成一下可发现生成了DLL和LIB文件,同时DllExportDemo.cpp中多了一个测试函数,这就是勾选导出符号的作用
动态链接库(DLL)的制作与使用_第11张图片
动态链接库(DLL)的制作与使用_第12张图片

在LoadDllDemo.cpp中现在来调用DllExportDemoo.dll,首先在DllExportDemoo.h中将DLL的编译方式改为C(这是由于C++的名称粉碎方式,这里需要避免一下),我们需要调用DLL中的输入42的函数,全部修改如下
动态链接库(DLL)的制作与使用_第13张图片
动态链接库(DLL)的制作与使用_第14张图片

在输出函数上打个断点调试一下,看能够输出42
动态链接库(DLL)的制作与使用_第15张图片

上面即动态链接库的函数使用方式,下面使用静态链接库lib来实现,第一步将DllExportDemo.h放入LoadDllDemo目录下,第二步将DllExportDemo.lib同样放到LoadDllDemo目录下,第三步在LoadDllDemo.cpp中包含二者,并调用DLL中的函数。
动态链接库(DLL)的制作与使用_第16张图片
动态链接库(DLL)的制作与使用_第17张图片
动态链接库(DLL)的制作与使用_第18张图片
动态链接库(DLL)的制作与使用_第19张图片

注意:
两种方式都得通过C的方式进行编译
extern “C” DLLEXPORTDEMOO_API int fnDllExportDemoo(void);

你可能感兴趣的:(Windows编程)