动态链接库-C/C++

创建dll

动态链接库 DLL(Dynamic Link Libarary)

DLL中包含若干共有的代码、数据、可以供其他模块使用

但是只有经过export导出后才允许被外部正常调用。

 

可以使用火绒剑这个软件查看进程的各种调用的dll文件

 

 

 

 

 

 

首先采用vs2019新建dll项目

 

 

在dllmain这个文件里,有一个DllMain函数,就相当于普通C语言的main函数,这里前面的APIENTRY是一个宏定义,往上一步一步找的话,就是一个__stdcall的一个函数约定具体内容百度查看。

 

DllMain

BOOL APIENTRY DllMain( HMODULE hModule,

//DLL模块的句柄handle

DWORD ul_reason_for_call,

//DLLMain函数被调用的原因

LPVOID lpReserved

//保留项,也就是Windows的保留参数

//保留参数并不是不用,而是Windows不想让我们

) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH:

//当DLL被进程加载时DLLmain被调用

case DLL_THREAD_ATTACH:

//有线程被创建时,DllMain被调用

case DLL_THREAD_DETACH:

//有线程结束时,DllMain被调用

case DLL_PROCESS_DETACH:

//有进程被结束时,DllMain被调用

break; } return TRUE; }

写switch分支的原因,是因为DLLmain可能被不止一次调用,每次调用执行不同的功能,在卸载DLL时,要释放资源

导出函数

只有dll文件有导出的函数,外部的程序才可以调用dll中的导出函数

 

导出函数的编写

导出:提供给外界利用

首先编写一个函数,然后再申明导出函数,把函数导出去

 

 

 

创建生成的lib和exp文件为当外部调用时需要添加的文件

 

extern "c"的作用:

主要作用就是为了能够正确实现c++代码调用其他函数,加上extern “c"后会让编译器将这部分代码按照c语言进行编译而不是C++来处理,因为C++支持函数重载,所以编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名。而C语言不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数包括函数名,所以这里就有了冲突,所以需要采用extern “c"来处理来进行对应的编译。来支持c++下处理C语言

__declspec(dllexport):

声明导出函数,将该函数从本DLL中开放提供给其它地方使用

dllexport/dllimport:

dllexportdllimport存储类属性是Microsoft特定扩展到C和C ++语言。您可以使用它们在DLL中导出和导入函数,数据和对象

 

编译 运行 关系

编译:

需要lib文件

在编译的时候必须把lib文件添加为对应的文件路径里面。

运行:

不需要lib文件,需要dll文件

对应完整代码