GetProcAddress 用于从DLL获取导出函数地址,必须确保函数名完全匹配(含C风格无修饰)、调用约定一致且DLL已正确加载,否则返回NULL;强行调用未校验的地址将导致崩溃。

直接说结论:用 GetProcAddress 加载 DLL 中的函数,必须确保函数名完全匹配(含修饰)、调用约定一致、且 DLL 已被正确加载;否则返回 NULL,强行调用会崩溃。
为什么 GetProcAddress 总是返回 NULL?
最常见原因是函数名不匹配。C++ 编译器会对函数名做名字修饰(name mangling),比如 int add(int, int) 可能变成 ?add@@YAHHH@Z。而 GetProcAddress 默认只认未修饰的 C 风格符号。
- 导出函数必须用
extern "C"声明,禁用 C++ 名字修饰 - DLL 工程中需在定义处加
__declspec(dllexport),或用 .def 文件显式导出 - 调用时传入的字符串必须和导出名完全一致(区分大小写,无空格)
- 可用
dumpbin /exports your.dll查看实际导出的符号列表
GetProcAddress 返回的函数指针怎么安全调用?
不能直接当普通函数用——类型不匹配会导致栈破坏或参数错位。必须先定义匹配的函数类型别名,再强制转换。
智能代理搜索。多源检索置信度评分 - 统一API整合网络、学术和Tavily搜索。
- 例如导出的是
int __cdecl calc(int a, int b),应定义:typedef int (__cdecl *calc_fn)(int, int); - 调用前务必判空:
if (proc != nullptr) { ((calc_fn)proc)(1, 2); } - 调用约定(
__cdecl/__stdcall)必须和 DLL 中定义的一致,否则栈无法平衡 - 不建议用
auto或void*接收返回值,类型擦除后失去编译期检查
加载 DLL 时 LoadLibrary 失败怎么办?
常见错误包括路径不对、依赖缺失、位数不匹配(32/64)、或 DLL 被占用。错误码可用 GetLastError() 获取。
立即学习“C++免费学习笔记(深入)”;
- 优先用绝对路径,或确保 DLL 在系统 PATH 或可执行目录下
- 用
Dependency Walker(x64dbg 自带模块查看器也行)检查是否缺MSVCPxx.dll等运行时 - 主程序和 DLL 必须同为 x86 或同为 x64,混用必失败
- 加载后记得配对调用
FreeLibrary,避免句柄泄漏(尤其热更新场景)
真正麻烦的不是调用语法,而是符号可见性与 ABI 兼容性——哪怕一个参数类型从 int 换成 long,都可能让 GetProcAddress 成功但运行时崩得无声无息。

















