库分两种,静态库和动态库,而动态库的加载方法又分两种,动态加载和静态加载
做为外部库,这两种库的加载都不需要包含头文件,因为相关的信息已经在导入库了
假设导入函数如下:add(int x, int y);
头文件如下:
extern "C" int __declspec(dllexport)add(int x, int y);
extern "C"代表c风格的,同时如果用不同的语言,则必需用相同的导入或者导出
源文件如下:
#include "test.h"
int add(int x, int y)
{
return x + y;
}
动态加载使用如下:
typedef int(*lpAddFun)(int, int);
HINSTANCE hDll; //DLL句柄
pAddFun addFun; //函数指针
hDll = LoadLibrary(TEXT("D:\\work\\dll\\dll\\Debug\\test.dll"));
addFun = (lpAddFun)GetProcAddress(hDll, "add");
int result = addFun(2, 3);//得到函数指针后使用
先用windows函数LoadLibrary()得到dll的句柄,然后再根据句柄得到函数指针
如果是动态加载,则在运行的时候才能加载上
静态加载使用方式如下:
#pragma comment(lib,"D:\\work\\dll\\dll\\Debug\\test.lib");
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" int __declspec(dllimport)add(int x,int y);
int result = add(3, 6);
由此可见,动态加载使用比较方便,同时在运行的时刻加载,得到函数指针后直接使用.
而静态加载程序一开始运行就加载,使用的时候如同程序内的函数一样,不需要LoadLibrary()即可