动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。
.c/.cpp 分别表示c语言和c++导出的dll文件方式。
一、.c导出给.c使用:
******************dll文件的头文件*******************
_declspec(dllexport) int add1(int a, int b);
_declspec(dllexport) double add2(double a, double b);
_declspec(dllexport) int add3(char* str1,int size, char* str2);
********************测试项目-使用文件(静态)***********************
#pragma comment(lib,"Calculater.lib")
********************测试项目-使用文件(动态)**********************
typedef int (*add1)(int a, int b);
typedef double (*add2)(double a, double b);
typedef int (*add3)(char *str, int len,char *st2 );
HMODULE hMoudle = GetModuleHandle("Calculater.dll");
hMoudle = LoadLibrary("Calculater.dll");
add1 fn1 = (add1)GetProcAddress(hMoudle, "add1");
int a1 = 10;
int b1 = 20;
printf("add1 : %d\n", fn1(a1, b1));
add2 fn2 = (add2)GetProcAddress(hMoudle, "add2");
add3 fn3 = (add3)GetProcAddress(hMoudle, "add3");
//FreeLibrary(hMoudle);
***********************************************************************
动态相比静态只是不需要加载.lib文件。
静态:.lib 、.dll
动态:.dll、API 添加lib文件。
***********************************************************************
二、.c导出给.cpp使用:
******************dll文件的头文件*******************
extern "C"
{
_declspec(dllexport) int add1(int a, int b);
_declspec(dllexport) double add2(double a, double b);
_declspec(dllexport) int add3(char* str1, int size, char* str2);
}
***********************测试项目-使用文件**************************
没问题
三、.cpp导出给.cpp使用
静态无问题✔
动态需要调整✖
只需要在调用函数名出添加参数。
add1 fn1 = (add1)GetProcAddress(hMoudle, "?add1@@YAHHH@Z");
即可。原因:c++导出的dll文件是带有一个参数的,缺少参数编译器无法找到。
四、导出dll类
类前添加关键字即可:
class __declspec(dllexport) Student {};
五、__cdecl和__stdcall区别
__cdecl使用对函数名无影响
__stdcall有影响
用在函数声明 类型之后 函数名之前