DLL本身为一个PE文件,而PE文件的导出表记录了哪些函数是需要导出的,也就是以下讲的实现DLL中函数的导出。
1、DLL的几种导出方式
(1) 第一种导出函数的方式
__declspec(dllexport) 函数名
例如:
__declspec(dllexport) int myAdd(int a, double b)
{
return a + b;
}
(2)第二种导出方式
模块定义文件(.def)来导出(不需要使用 __declspec(dllexport),但是需要使用.def文件声明哪些函数需要导出)
例如:
int mySub(int a, int b)
{
return a - b;
}
(3)导出为C语言的方式,失去多态的性能(C++才具有多态)
extern "C" __declspec(dllexport) int myAdd(int a, int b)
{
return a + b;
}
2、DLL的导入方式
(1)第一种导入dl的方式, 隐式调用
__declspec(dllimport) int myAdd(int a, float b);
#pragma comment(lib,”..\Debug\MyDll.lib”) // 导入一个dll对应的导入库。。。
(2)显示调用,相对于隐式调用,在程序升级后(更新DLL),不需要重新编译EXE文件,因为
MyDLL动态链接库里面的函数信息:
3、动态链接库发布
一般包含一个头文件,然后用户只需要链接lib文件和包涵头文件就可以了
客户调用事例:
#include “../WinDLL/WinDll.h”
#pragma comment(lib,”../Debug/WinDLL.lib”)
4、DLL应用程序的入口点
在调用DLL动态链接库的时候,会通过入口点加载动态链接库到内存中,才方便于程序的使用。(可以在程序的入口点这里加入想要的信息,用户在调用动态链接库的时候就会调用加载的信息)
BOOL WINAPI DllMain( HINSTANCE hModule,
DWORD dwReason,
LPVOID lpvReserved );
一般在这里进行一些资源的初始化以及资源的释放!
LoadLibrary时初始化资源,DLL_PROCESS_ATTACH
FreeLibrary时释放资源,DLL_PROCESS_DETACH
以上为DLL的相关学习笔记