使用动态加载的方式使用动态库。
loadlibrary()
成功加载动态库
之后使用GetProcAddress()
方法得到函数指针却返回空值,使用GetLastError()
方法得到错误代码127
出现此错误的原因一般是要加载的函数名称与动态库中函数名称不一致,要从库中加载的函数名为multiply
用depends.exe
查看动态库文件,需要的函数名称却是?multiply@@YAHH@Z
,显然是错误的
因此怀疑是动态库生成的问题
动态库头文件
#pragma once
__declspec(dllexport) int multiply(int);
class __declspec(dllexport) cABC{
private:
char symbol;
public:
cABC(char symbol);
void print_love();
};
百度原因,说是extern “C”
可以将导出函数名字固定。大概原因说是c与c++编译器不同。c++支持函数重载,实现方法是在编译阶段的函数被重命名变成函数名加参数名,类似?multiply@@YAHH@Z
这种代号,而c编译器就不会有这种机制了。加入extern “C”,能够实现c/c++混合编程。程序按照c编译器的方式编译链接。
具体原因就没有深究了,既然如此,那就这样用试试看
extern的使用规则:
extern "C" void function();
extern "C" class className{
...
};
或者
extern "C"{
void function();
class className{
...
};
}
更好的写法是加入对c++的判断
#ifdef __cplusplus
extern "C" void function();
#else
void function();
#endif
或者
#ifdef __cplusplus
extern "C" {
#endif
void function();
#ifdef __cplusplus
}
#endif
按照此方法,修改头文件,重新编译一遍库。结果是GetProcAddress()
成功返回函数地址
#pragma once
#ifdef __cplusplus
extern "C"{
#endif
__declspec(dllexport) int multiply(int);
class __declspec(dllexport) cABC{
private:
char symbol;
public:
cABC(char symbol);
void print_love();
};
#ifdef __cplusplus
}
#endif
查看DLL文件,已经是正常的函数名字