无法通过GetProcAddress调用自定义DLL中的函数
解决GetProcAddress返回错误127(找不到指定过程)的问题
错误码127的核心原因是C++编译器的名字修饰机制:你在DLL中声明的Add函数,虽然加了__declspec(dllexport),但C编译器会对函数名进行修饰(比如VC下__cdecl的函数会被修饰为_Add),导致导出表中的函数名和你在GetProcAddress中传入的"Add"不匹配。
下面是三种可行的解决方法:
方法一:用extern "C"避免名字修饰
修改DllAdd的main.cpp代码,给导出函数加上extern "C",强制编译器按照C语言的规则导出函数(不进行C++名字修饰):
extern "C" __declspec(dllexport) int __cdecl Add(int x, int y) { return x + y; }
重新编译DLL后,导出表中的函数名就是"Add",和你调用GetProcAddress时传入的名字完全匹配。
方法二:使用.def模块定义文件指定导出名
在DllAdd项目中添加一个后缀为.def的文本文件,内容如下:
LIBRARY DllAdd EXPORTS Add @1
然后在项目属性的「链接器->输入」中,将这个.def文件设置为「模块定义文件」。这种方式会强制编译器导出"Add"这个名字,不受名字修饰规则影响。
方法三:使用修饰后的函数名调用(不推荐)
如果你不想修改DLL代码,可以先查看DLL实际导出的函数名:
- 打开VS的开发者命令提示符
- 执行命令:
dumpbin /exports DllAdd.dll - 在输出结果中找到
Add对应的修饰名(比如VC++下是_Add)
然后修改AddExec中的GetProcAddress调用,传入修饰后的名字:
AddPtrType AddLocal = (AddPtrType)GetProcAddress(DllAddModule, "_Add");
这种方法的缺点是不同编译器的名字修饰规则不同,代码的可移植性差。
验证步骤
可以用dumpbin /exports DllAdd.dll工具查看DLL的导出表,确认函数名是否和你调用时使用的一致,这是排查这类问题的关键步骤。
内容的提问来源于stack exchange,提问作者Kayla
相关产品推荐
相关产品推荐

