添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

相信很多人在显式调用dll中函数的时候,会遇到相同的问题:
就是我们loadlibrary成功后,明明调用的函数也是正确的,但是GetProcAddress的地址总是为0!不能获得正确的函数地址。

我们先来看我这次出错的示例:

DLL部分

__declspec(dllexport) BOOL xxxxxxx();
xxxxxx()
	xxxxxxx;

exe调用dll部分

	HMODULE hInst;
	hInst = LoadLibrary(L"Dll1.dll");
	if (NULL == hInst)
		printf("LoadLibrary failed!\r\n");
		return;
		printf("LoadLibrary success!\r\n");
	typedef BOOL(*LPFN_xxxxx)();
	LPFN_xxxxx lpfn_xxxxx = (LPFN_xxxxx)GetProcAddress(hInst, "lpfn_xxxxx");

看起来似乎没有什么问题。
在dll中导出函数:__declspec(dllexport)
在exe中调用:
LoadLibrary(L"Dll1.dll");和GetProcAddress(hInst, “lpfn_xxxxx”);都没什么问题。

C++的编译方式考虑了函数重载,所以对函数名进行了新的修饰,产生了所谓的破坏性命名。

这样实际上,我们在exe中调用的函数名字就是已经被修饰过的,所以我们直接按照原来的函数名自然就找不到了!

解决方案:

  1. .def文件
EXPORTS
   MyFunction
   MyFunction2
   ...
  1. extern"C"
    extern 表示这是个全局函数,可以供各个其他的函数调用; “C” 表示编译时按照 C编译器的方式进行编译,而不是C++。
extern "C" __declspec(dllexport)

总结:
自己属实太长时间没写过代码了,拉了跨了,以前的习惯都忘了

使用动态加载的方式使用动态库。 loadlibrary()成功加载动态库 之后使用GetProcAddress()方法得到函数指针却返回空值,使用GetLastError()方法得到错误代码127 出现此错误的原因一般是要加载的函数名称与动态库中函数名称不一致,要从库中加载的函数名为multiply 用depends.exe查看动态库文件,需要的函数名称却是?multiply@@YAHH@Z,显然是错误的 因此怀疑是动态库生成的问题 动态库头文件 #pragma once __declspec(dllex 题图只是回想起了二十多年前中学时代看《乱马1/2》的我,而今我却已经老了。 ——但是强烈谴责八宝斋/八宝齐的行为!恶趣味对于剧情几乎没有任何推进作用。(2020.4.23更新)今天听到一首歌,感觉就是八宝斋/八宝齐说的:“那女孩对我说/说我是一个小偷”首先得知道什么是0-1背包问题(knapsack problem)◆ 贼,夜入豪宅,可偷之物甚多,而负重能力有限,偷哪些才更加不枉此行?◆ 抽... #define EXPORT_DLL extern "C" __declspec(dllexport) #else #define EXPORT_DLL __declspec(dllexport) #define FUNCTION_NAME(i) (LPCSTR)MAKEINTRESOURCE(i) TestFunction function = (TestFunction)GetProcAddress(hDLL, FUNCTION_NAME(FUNCTION_IN 上一篇14 交叉熵损失函数——克服学习缓慢从最优化算法层面入手,将二次的均方误差(MSE)更换为交叉熵作为损失函数,避免了当出现“严重错误”时导致的学习缓慢。本篇引入1/sqrt(nin)权重初始化方法,从另一个层面——参数初始化(神经网络调教的5个层面归纳在13 AI驯兽师:神经网络调教综述)入手改善网络的学习速度。相比之前采用的标准正态分布初始化,1/sqrt(nin)权重初始化不仅明显的加快...