Main.c
#include <stdio.h> #include <windows.h> typedef int(*lpAddFun)(int, int); //宏定义函数指针类型 int main(int argc, char *argv[]) { HINSTANCE hDll; //DLL句柄 lpAddFun addFun; //函数指针 hDll = LoadLibrary("test.dll"); if (hDll != NULL) { addFun = (lpAddFun)GetProcAddress(hDll, "add"); if (addFun != NULL) { int result = addFun(2, 3); printf("%d\n", result); } FreeLibrary(hDll); } return 0; } |
Dll.h
#ifndef LIB_H #define LIB_H extern "C" int __declspec(dllexport)add(int x, int y); #endif |
Dll.c
#include "dll.h" int add(int x, int y) { return x + y; }
|
上面是一个通过调用动态链接库的例子,通过编译成dll,代码中DLL加载-DLL函数地址获取-DLL释放的顺序来完成程序库的调用。
extern "C" int __declspec(dllexport)add(int x, int y);:声明动态库里面的函数是一种导出函数的方式,一般动态库里面的函数有两种方式,有内部函数(只供程序内部调用)和导出函数(程序外部可以调用)两种。
typedef int(*lpAddFun)(int, int):获取函数里面的地址的函数指针。
LoadLibrary("test.dll");:加载动态连接库。
GetProcAddress(hDll, "add");:获取动态链接库里面add函数的地址。
FreeLibrary(hDll);:释放加载的动态链接库,之后将不可以应用函数add。