0

0

C++ 怎么调用DLL函数 C++ LoadLibrary与GetProcAddress【动态库】

尼克

尼克

发布时间:2026-01-30 17:10:45

|

576人浏览过

|

来源于php中文网

原创

LoadLibrary失败先查GetLastError:126为依赖缺失,193为架构不匹配;用绝对路径、Dependency Walker查依赖、确保位数一致;C++导出需extern "C"防名字修饰;GetProcAddress返回值须强转为匹配调用约定的函数指针类型。

c++ 怎么调用dll函数 c++ loadlibrary与getprocaddress【动态库】

LoadLibrary 失败返回 NULL 怎么排查

调用 LoadLibrary 返回 NULL 是最常见卡点,不是路径错就是依赖缺失。先用 GetLastError() 拿错误码,再查对应含义——比如 126 表示找不到 DLL 或其某个依赖项(如 MSVCP140.dll),193 表示架构不匹配(x64 程序加载了 x86 DLL)。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 用绝对路径传给 LoadLibrary,避免当前工作目录干扰;路径中反斜杠必须双写:"C:\\path\\mylib.dll"
  • Dependency Walkerdumpbin /dependents mylib.dll 查看依赖项,确认所有 .dll 都在 PATH 或同目录
  • 确保进程位数与 DLL 一致:VS 中项目属性 → 配置管理器 → 平台必须匹配(Win32 ≠ x64)
  • 如果 DLL 有静态 C++ 运行时(/MT),而主程序用动态(/MD),可能引发初始化失败,此时 GetLastError 可能返回 1114(DLL 初始化例程失败)

GetProcAddress 找不到函数名?注意 C++ 名字修饰

直接传 "MyFunc"GetProcAddress 失败,大概率是 C++ 编译器对函数名做了修饰(name mangling)。DLL 导出的是 C 风格符号才可用原名查找;C++ 成员函数、重载函数、模板函数默认无法按名字导出。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • DLL 工程中,用 extern "C" 包裹导出函数声明:
    extern "C" __declspec(dllexport) int MyFunc(int x);
  • 或者在 .def 文件里显式指定导出名,绕过修饰:
    EXPORTS
    MyFunc @1
  • dumpbin /exports mylib.dll 确认实际导出的符号名——如果看到类似 ?MyFunc@@YAHH@Z,说明没加 extern "C"
  • 不要试图用修饰后的名字硬写进代码,跨编译器不可靠;坚持用 extern "C" + 显式调用约定(如 __cdecl)最稳妥

函数指针类型声明不对会导致调用崩溃

GetProcAddress 返回 FARPROC(即 void*),必须强制转成**完全匹配的函数指针类型**,否则参数压、返回值解析全错,轻则结果异常,重则访问违规。

知识画家
知识画家

AI交互知识生成引擎,一句话生成知识视频、动画和应用

下载

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 定义 typedef 时,调用约定必须和 DLL 中一致:
    typedef int (__cdecl *MYFUNC)(int);
    MYFUNC pFunc = (MYFUNC)GetProcAddress(hMod, "MyFunc");
  • 忘记写 __cdecl 或写成 __stdcall 是高频崩溃原因;若 DLL 是 C 函数,默认是 __cdecl;若用 WINAPI(即 __stdcall)导出,这里也得同步
  • 参数个数、类型、顺序、返回值类型缺一不可;bool 和 BYTE、int 和 long 在不同平台可能宽度不同,尽量用 int32_t 等固定宽度类型
  • 调用前务必检查 pFunc != nullptr,否则直接崩溃

卸载 DLL 前必须确保没有线程正在执行其中代码

FreeLibrary 不会立即释放 DLL 内存,而是递减引用计数;但如果某线程正停在 DLL 函数里(比如等待 IO 或 sleep),此时调用 FreeLibrary,后续该线程恢复执行时就会访问已释放内存,导致未定义行为。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 除非明确需要热更新,否则通常不需要主动 FreeLibrary;进程退出时系统自动清理
  • 若必须卸载,确保所有调用方已退出相关函数,并且 DLL 内部无后台线程存活(比如它自己创建的 worker thread)
  • 可以配合 DisableThreadLibraryCalls(hMod) 减少线程附加/分离开销,但不影响安全性判断
  • 多次 LoadLibrary 同一个 DLL 会返回相同句柄,引用计数+1;对应要调用同样次数的 FreeLibrary 才真正释放
C++ 动态调用 DLL 的核心就三点:路径和依赖不出错、符号名不被修饰、函数指针类型严丝合缝。最容易忽略的是调用约定和跨模块类型对齐——看着能编译通过,跑起来崩得毫无征兆。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

237

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

109

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.26

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

109

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号