当前位置: 首页 > news >正文

C++中显示与隐式加载dll的使用与区别

一、什么是 DLLDLLDynamic Link Library是 Windows 下的动态链接库包含可被多个程序共享的函数、资源或类。使用 DLL 可以实现代码复用、模块化设计和插件机制。在 C 中调用 DLL 中的函数有两种主要方式隐式链接Implicit Linking显式链接Explicit Linking二、隐式链接Implicit Linking1. 原理程序启动时自动加载 DLL通过.lib导入库将 DLL 中的函数符号链接到可执行文件中。2. 使用步骤1准备三个文件MyDll.dll动态库文件MyDll.lib导入库由 DLL 生成MyDll.h声明导出函数2头文件示例MyDll.h123456789#ifdef __cplusplusexternC{#endif__declspec(dllimport)intAdd(inta,intb);#ifdef __cplusplus}#endif注意dllimport表示从 DLL 导入函数。3链接.lib文件在项目中添加.lib路径并链接1#pragma comment(lib, MyDll.lib)4直接调用函数123#include MyDll.hintresult Add(3, 4);// 直接像普通函数一样调用3. 特点优点缺点使用简单像调用本地函数启动时必须找到 DLL否则程序无法启动编译期检查函数签名不支持动态选择或延迟加载性能略高无需查表难以实现插件系统或热更新三、显式链接Explicit Linking1. 原理运行时通过LoadLibrary和GetProcAddress手动加载 DLL 并获取函数地址。2. 使用步骤1不需要.lib文件只需MyDll.dllMyDll.h知道函数原型2加载 DLL 并获取函数指针12345678910111213141516171819202122232425262728293031#include windows.h#include iostream// 定义函数指针类型typedefint(*AddFunc)(int,int);intmain(){HMODULEhDll LoadLibrary(_T(MyDll.dll));// 加载 DLLif(hDll NULL) {std::cout 无法加载 DLL std::endl;return-1;}// 获取函数地址AddFunc Add (AddFunc)GetProcAddress(hDll,Add);if(!Add) {std::cout 无法找到函数 Add std::endl;FreeLibrary(hDll);return-1;}// 调用函数intresult Add(3, 4);std::cout 结果 result std::endl;// 卸载 DLLFreeLibrary(hDll);return0;}3. 特点优点缺点运行时动态加载灵活使用复杂需手动管理函数指针可判断 DLL 是否存在提供降级方案无编译期检查易出错函数名拼错支持插件系统、热更新、按需加载性能稍低需查表程序可容忍缺失 DLL需要正确处理FreeLibrary防止内存泄漏四、核心区别对比表对比项隐式链接显式链接加载时机程序启动时自动加载运行时手动加载LoadLibrary是否需要 .lib是否可选函数调用方式直接调用如 Add(1,2)通过函数指针调用启动依赖必须存在 DLL否则无法启动可容忍缺失运行时报错灵活性低高可动态选择、卸载、替换适用场景核心功能、稳定依赖插件、可选模块、第三方组件错误处理启动失败可在运行时提示用户性能略高略低需查找符号典型 API无编译器自动处理LoadLibrary, GetProcAddress, FreeLibrary五、如何选择场景推荐方式程序核心功能依赖的 DLL如运行库✅ 隐式链接第三方 SDK、硬件驱动接口✅ 显式链接容错更好实现插件系统如 Photoshop 滤镜✅ 显式链接需要热更新或动态替换模块✅ 显式链接小项目、简单调用、DLL 一定存在✅ 隐式链接更方便六、最佳实践建议优先考虑显式链接用于第三方或可选模块提升程序健壮性。使用 RAII 封装HMODULE避免忘记FreeLibrary12345678classDllLoader {public:DllLoader(constTCHAR* name) { hDll LoadLibrary(name); }~DllLoader() {if(hDll) FreeLibrary(hDll); }HMODULEget() {returnhDll; }private:HMODULEhDll nullptr;};导出 C 函数用extern C避免 C 名称修饰问题。在发布程序时确保 DLL 路径正确当前目录、系统路径、应用程序目录等。
http://www.rkmt.cn/news/1386849.html

相关文章:

  • Simulink仿真避坑指南:单相全桥逆变电路方波驱动相位设置(θ=30° vs 60°)对输出波形的影响深度对比
  • Allegro等长设置翻车实录:拓扑模板法的3个坑与手工PinPair的救赎
  • ThinkPad开机嘀嘀响或报2100/2110错误?可能是硬盘松了!自己动手检测与修复指南
  • 混合求解器:用神经网络增强传统微分方程数值方法
  • 多元背景下的求职时代
  • 02华夏之光永存:火星无地基超级AI主脑无人自主运维系统全链条解决方案
  • PyTorch/Jupyter环境搭建避坑实录:我是如何绕过nb_conda安装,用ipykernel搞定一切的
  • 微信小游戏4MB包体极限瘦身实战:WebP+分包+Addressables协同方案
  • 南京企税帮公司注册服务高效标准化赋能创业:南京代账公司/南京保安许可证办理/南京公司代办/南京出版物许可证办理/选择指南 - 优质品牌商家
  • DDIA_Day02_数据模型与系统关系
  • 在腾讯云轻量服务器上,用Docker部署带ARM转译的ReDroid安卓容器(实测踩坑记录)
  • VRM转Unity全流程:解决FBX导入材质丢失与贴图错误
  • 基于XGBoost与SHAP的分子气味预测:从特征工程到可解释性分析
  • Unity超休闲游戏上线模板:Google Play合规与性能预埋实践
  • AssetStudio深度解析:Unity资源加载原理与故障排除实战
  • Unity真机帧率监控:解耦CPU/GPU/Present三帧率
  • 企业办公新方式:企业微信联动 OpenClaw 2.7.5 搭建智能协作体系
  • 2026年航空、建筑及食品行业,全行业资产管理系统优选推荐
  • 消费推荐激励模型:2026 年实体商业增长新路径的合规分析与应用指南
  • Unity着色器编译全流程解析:从Shader代码到GPU指令
  • USBCopyer终极指南:Windows平台U盘文件智能备份神器
  • Unity Shader编译优化:破解变体爆炸与编译卡顿
  • VR+机器学习:革新阅读障碍筛查的沉浸式评估方案
  • 西安国际搬家技术全解析:广州宠物空运、新加坡国际搬家、新加坡宠物托运、杭州国际搬家、杭州宠物空运、澳大利亚国际搬家选择指南 - 优质品牌商家
  • 移远EC21/EC200模组休眠实战:从13mA异常功耗到稳定6mA的排查与修复
  • AI第二人格:用AutoGen打造永不掉线的多智能体对话系统
  • 随机森林在引力波信号分类与天体物理概率估计中的实践
  • 2026温州科室标牌实测评测:温州景观雕塑标识、温州标牌、温州标识牌、温州玻璃钢景观雕塑、温州科室牌、温州精神堡垒选择指南 - 优质品牌商家
  • Live2D模型资源提取与可编辑资产重建指南
  • Live2D资源提取本质:Unity中Cubism二进制协议逆向与资产复原