GetProcAddress无法找到DLL文件内U2U_Test函数的问题咨询
DLL调用时GetProcAddress返回NULL的解决方案
你遇到的问题核心原因通常是导出函数名不匹配、DLL加载异常两类,具体排查解决步骤如下:
常见原因排查
- 导出函数名被修饰导致不匹配
如果目标DLL是C开发且导出时未加extern "C"声明,编译器会对函数名进行C名字修饰,最终导出的函数名不会是纯U2U_Test,可能是?U2U_Test@@YAXXZ这类带修饰规则的字符串;如果函数使用__stdcall调用约定,导出名还可能变成_U2U_Test@0这类格式。
你用Dependency Walker查看时不能只看函数签名,要专门看导出列表的名称列,确认实际导出的函数名字符串。 - DLL未成功加载
你当前只对LoadLibrary返回值做了非空判断,没有打印错误码确认失败原因:- 路径问题:
my_dll.dll是否放在程序运行目录、系统目录或已加入环境变量的路径下 - 位数不匹配:你的主程序位数(32位/64位)和DLL位数必须严格一致,跨位数无法加载
- 依赖缺失:目标DLL本身依赖的其他DLL不存在,也会导致加载失败
- 路径问题:
修复方案
- 若DLL是你自行开发,在导出函数声明时添加
extern "C"避免名字修饰,示例如下:
#ifdef __cplusplus extern "C" { #endif // 确保导出函数名和你调用时传入的名称一致 __declspec(dllexport) void U2U_Test(void); #ifdef __cplusplus } #endif
- 若DLL是第三方不可修改,直接将Dependency Walker查到的真实导出函数名作为参数传入
GetProcAddress即可;也可以通过函数序号调用,兼容性差不推荐。 - 补充错误排查代码,加载失败时调用
GetLastError()获取错误码,快速定位问题。
额外语法提示:你的
check函数返回值声明为void,末尾return addr();属于语法错误,直接调用addr();即可不需要加return。
内容的提问来源于stack exchange,提问作者Sasan
相关产品推荐
相关产品推荐

