一、动态链接库(DLL)
动态链接库提供了一种方法,使进程可以调用不属于其执行代码的函数。函数的可执行代码位于一个.dll文件中,该文件包含一个或多个已被编译、链接并使用它们的进程分开存储的函数。
优点:
1.扩展了 应用程序的特性
2.可以使用多种编程语言来编写
3.简化项目的管理
二、依赖项
当某个程序或DLL使用其他DLL或DLL函数时,就会创建依赖项,因此程序就不会再独立了,依赖项如果被破坏,该程序可能出现问题。
三、入口点
在创建DLL时,可以有选择地指定入口点的函数。当进程或线程将它们自身附加到DLL或者将它们自身以DLL分离时,都会调用入口函数。入口函数应该只进行简单的初始化工作,而不应该调用其他DLL函数或者终止函数。
关于创建DLL,我的环境是VS2017,步骤为:文件->新建项目->选择动态链接库(DLL)->完成。在创建的项目中的源文件可以看到有一个已经创建好的dllmain.cpp,这个就DLL入口点的代码了。
四、如何导出(在DLL中实现的)
第一种:
步骤1:向所有需要导出的DLL函数中添加关键字__declspec(dllexport)。
步骤2:要在应用程序中使用导出的DLL函数,必须使用__declspec(dllexport)来声明要导入的各个函数。
本章使用的就是这种方法
通常最好使用一个包含define语句和ifdef语句的头文件,以便分隔导出语句和导入语句,代码如下。
说明:该DLL库实现的是简单的加减乘除运算,注意实现减法的这个函数,我这里特别使用了一个抽象类来实现,我发现有些企业代码都会有这种类似的抽象类,然后用纯虚函数做接口。
第二种:
创建模块定义文件.def以列出导出的DLL函数:
五、特别调用
需要注意以下一些情况:
1.如果使用了Win32 API,则应该使用关键字__stdcall修饰函数
2.如果将C++生成的DLL供标准C语言使用,输出文件用extern "C"来修饰,设置导出函数时采用.def文件形式,而不是__declspec(dllexport)
六、编写DLL
创建DLL工程并且定义了相应的导出函数、变量或类之后,接下来就是实现功能了。本章中因为CExportDll是一个抽象类,所以需要再创建一个它的子类(CExportDllChild.h中),实现相应的接口功能(EXportDll.cpp中),同时其他函数也在(EXportDll.cpp)中实现功能。
创建编写好后,进行生成,可以在项目Debugp目录下看到生成的动态库.dll和静态库.lib
七、调用DLL
调用DLL有两种方法,一种是显式链接方式,另一种是隐式链接方式。
在调用前,先创建一个Win32控制台应用程序或者MFC,这里创建的是一个简单的Win32程序(LoadDll)
1.显式链接:
在此项目中,需要将CExportDllChild.h放在LoadDll目录下。然后在cpp中添加以下代码
调用结果:
2.隐式调用
在程序开始执行时就将DLL文件加载到应用程序中。隐式调用没用过,不做表述了。