动态链接库的创建和使用
一. 创建动态链接库
1. 创建动态链接库项目
1. 1 动态链接库(DLL)
项目结构如下
为了节约大型项目的编译时间,系统自动为我们生成了和预编译头相关两个文件pch.cpp和pch.h,我们可以选择保留或者是删除他们。如果决定保留则需要在项目中每个源文件的最前面加入#include "pch.h"
,否则无法通过编译。如果删除了他们,同时还需要到项目属性中禁用预编译头,具体方法如下:
dllmain.cpp定义了动态库的入口,当系统开始或终止一个进程或线程的时候,会调用每个被加载的动态库的DllMain
函数,此外在使用LoadLibrary
加载一个动态库,或者FreeLibrary
卸载一个动态链接库的时候该函数也会被调用。该函数的ul_reason_for_call
参数记录了其被调用的原因,我们可以在函数体内通过一个switch
语句对特定时间做出响应。该函数默认代码如下:
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
1.2 具有导出项的(DLL)动态链接库
另一种方法是创建具有导出项的动态链接库项目,和上面类似,只是这种项目自动生成了和项目同名的头文件和源文件,用于编写导出函数。
1.3 空项目
如果嫌以上系统提供的动态链接库模板内容繁琐,也可以创建空项目自行配置:
首先修改项目类型为动态库:
之后添加用于声明和实现导出函数的源文件和头文件,源码见下一小节。
2. 导出函数
2.1 动态链接库(DLL)
首先在头文件function.h中声明导出函数swapNumber
,编写如下代码:
#pragma once
extern "C"
{
__declspec(dllexport) void swapNumber