导出DLL注意事项
如果使用者是利用 头文件和LIB静态链接库 使用DLL的话,那么就正常写函数声明即可:
extern "C" __declspec(dllexport) int __stdcall add(int a, int b);
如果调用者知道动态库中的函数而直接 显式调用 的话(Depends工具可以查看DLL中函数),那么导出的DLL库,需要在源文件目录下额外添加def模板定义文件,内容格式如下:
LIBRARY
EXPORTS
add;
在EXPORTS下,写明你的函数名字,因为编译器导出的DLL文件中,函数名字会被更改(比如add函数名,可能他实际的函数名字会变成add@1这样子)这种方法显式告诉编译器导出的函数名字,使用的时候才不会报错。
使用DLL注意事项
这里注意事项还是显式调用时要注意的,例如下面的调用代码:
#include <iostream>
#include <windows.h>
int main()
{
HMODULE hM = LoadLibrary(L"startDLL.dll");
if (!hM)
{
std::cout << "加载库失败!" << std::endl;
return -1;
}
typedef int (*MyAdd)(int a, int b); // 注意这一行!!!!!!!!!!!!!!!!!!!
MyAdd add = (MyAdd)GetProcAddress(hM, "add");
std::cout << "计算结果是:" << add(133, 4124) << std::endl;
return 0;
}
死活跑不通,跑不通的其实要声明标准C接口调用,那么我上面做注释的地方应该这么写:
typedef int (WINAPI *MyAdd)(int a, int b); // 正确写法,多了一个 WINAPI
这里WINAPI的定义是:
#define WINAPI __stdcall