【C++】动态库动态加载实例详解

news2024/10/27 15:28:48

动态库动态加载:LoadLibrary与函数地址获取详解

    • 一、概述
    • 三、加载失败的原因及解决方案
      • DLL文件不存在或路径不正确:
      • 依赖的其他DLL未找到:
      • 权限问题:
      • DLL版本不兼容:
    • 四、总结

在这里插入图片描述

在软件开发中,模块化设计是一种非常重要的思想,它通过将不同的功能封装成独立的模块,使代码更加清晰、易于管理和维护。动态链接库(DLL)作为一种重要的模块化手段,广泛应用于C++等编程语言中。DLL不仅有助于程序的模块化封装,还为第三方厂商接入系统提供了便利,通过SDK动态库实现二次开发。本文将详细介绍动态库动态加载的相关内容,并特别关注在使用LoadLibrary函数时可能出现的加载失败问题,同时提供代码实例加以说明。

一、概述

DLL动态库是一种包含程序代码和数据的可执行文件,它可以在运行时被程序加载和链接。通过将功能封装成DLL,我们可以实现代码的模块化封装,使程序更加灵活和易于维护。此外,为了方便第三方厂商接入我们的系统进行二次开发,我们通常会将相关业务封装成SDK动态库供他们使用。
在C++程序中,通常会使用多个DLL库。在发布程序时,这些DLL库需要被打包到安装包中一起发布。安装过程中,这些DLL会被放置到程序的安装目录中(有时个别库可能需要放到系统路径中)。这些DLL库主要包括程序依赖的业务库、第三方开源库、C/C++运行时库以及UCRT系统通用运行时库等
##二、动态加载DLL
在Windows操作系统中,动态加载DLL通常使用LoadLibrary函数。该函数可以在运行时加载指定的DLL文件,并返回一个模块句柄(HMODULE),用于后续的函数地址获取等操作。如果加载失败,LoadLibrary将返回NULL。
下面是一个使用LoadLibrary动态加载DLL并获取函数地址的示例代码:

cpp
#include <windows.h>
#include <iostream>

typedef void (*MyFunctionType)();

int main() {
    // 加载DLL
    HMODULE hModule = LoadLibrary("example.dll");
    if (hModule == NULL) {
        std::cerr << "Failed to load DLL" << std::endl;
        return 1;
    }

    // 获取函数地址
    MyFunctionType myFunction = (MyFunctionType)GetProcAddress(hModule, "MyFunction");
    if (myFunction == NULL) {
        std::cerr << "Failed to get function address" << std::endl;
        FreeLibrary(hModule);
        return 1;
    }

    // 调用函数
    myFunction();

    // 释放DLL
    FreeLibrary(hModule);

    return 0;
}

在这个示例中,我们首先使用LoadLibrary函数加载名为example.dll的DLL文件。如果加载成功,LoadLibrary将返回一个非NULL的模块句柄。然后,我们使用GetProcAddress函数获取名为MyFunction的函数地址。如果获取成功,我们将该地址转换为函数指针类型,并调用该函数。最后,我们使用FreeLibrary函数释放加载的DLL。

三、加载失败的原因及解决方案

在使用LoadLibrary动态加载DLL时,有时会出现加载失败的问题。这可能是由于多种原因导致的,如DLL文件不存在、路径不正确、依赖的其他DLL未找到等。

DLL文件不存在或路径不正确:

确保DLL文件存在于指定的路径中。
如果DLL文件位于系统路径或特定目录(如C:\Windows\System32),则无需指定完整路径。
如果DLL文件位于其他目录,则需要提供完整路径或使用SetDllDirectory函数添加搜索路径。

依赖的其他DLL未找到:

使用工具(如Dependency Walker)检查DLL的依赖关系。
确保所有依赖的DLL都已正确安装并位于搜索路径中。

权限问题:

确保程序具有加载DLL所需的权限。
如果DLL位于受保护的目录(如C:\Windows\System32),则可能需要以管理员身份运行程序。

DLL版本不兼容:

确保DLL的版本与程序的预期版本相匹配。
如果程序依赖于特定版本的DLL,则可能需要使用版本控制工具(如DLL Hell Solver)来管理DLL版本。

四、总结

动态链接库(DLL)作为一种重要的模块化手段,在C++等编程语言中得到了广泛应用。通过动态加载DLL,我们可以实现代码的灵活性和可扩展性。然而,在使用LoadLibrary函数动态加载DLL时,可能会出现加载失败的问题。本文详细介绍了动态加载DLL的相关内容,并提供了代码实例加以说明。同时,我们还探讨了加载失败的可能原因及解决方案,以帮助开发者更好地应对这一问题。通过合理使用动态库和加载机制,我们可以构建更加高效、灵活和可扩展的软件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Spring Boot的学生宿舍信息资源整合

3系统分析 3.1可行性分析 通过对本学生宿舍信息管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本学生宿舍信息管理系统采用Spring Boot框架&#xff0…

【C++笔记】内存管理

前言 各位读者朋友们大家好&#xff0c;上期我们讲了类和对象下的内容&#xff0c;类和对象整体的内容我们就讲完了&#xff0c;接下来我们开启新的部分内存管理的讲解。 目录 前言一. C/C内存分布二. C语言中内存管理的方式三. C内存管理方式3.1 new/delete操作内置类型3.2…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门&#xff08;Update Gate&#xff09;&#xff1a;决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门&#xff08;Reset Gate&#xff09;&#xff1a;用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…

idea 无法输入中文 快速解决

idea在某些情况会出现无法输入中文的情况&#xff0c;我们不去深究内部原因&#xff0c;直接上解决方案&#xff1a; 1、点击菜单help->Edit Custom VM Options 2、最后一行&#xff0c;追加&#xff1a; -Drecreate.x11.input.methodtrue 、 3、重启

计算机毕业设计Java连锁超市销售与分析系统 销售数据管理 超市运营分析 数据可视化 (源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

10月27日

取P为A 秩1矩阵只有1个特征值为正&#xff0c;其余为1

YOLO11 目标检测 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签

本文分享使用YOLO11进行目标检测时&#xff0c;实现模型推理预标注、自动标注、标签格式转换、以及使用Labelme手动校正标签等功能。 目录 1、预训练权重 2、生成预标注 3、分析YOLO11的目标检测格式 4、分析Labelme标注工具的格式 5、生成json标注文件 6、手动校正标签 …

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶VNC

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

PHPOK 4.8.338 后台任意文件上传漏洞(CVE-2018-12941)复现

PHPOK企业站(简称PHPOK&#xff09;建设系统是一套基于PHP和MySQL构建的高效企业网站建设方案之一&#xff0c;全面针对企业网&#xff08;以展示为中心&#xff09;进行合理的设计规划。 PHPOK是一套开源免费的建站系统&#xff0c;可以在遵守LGPL协议的基础上免费使用。系统具…

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案

前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s&#xff0c;感觉非常巴适&#xff0c;就研究了一下&#xff0c;首先遇到无法迁移老系统应用问题比较好解决&#xff0c;使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…

腾讯云视频文件上传云存储时自动将mp4格式转码成m3u8

针对问题&#xff1a; 弱网环境下或手机网络播放mp4格式视频卡顿。 存储环境&#xff1a;腾讯云对象存储。 处理流程&#xff1a; 1&#xff1a;登录腾讯云控制台&#xff0c;进入对象存储服务&#xff0c;找到对应的存储桶&#xff0c;点击进入。 在任务与工作流选项卡中找…

Linux复习-C++

参考博客&#xff1a; https://blog.csdn.net/qq_45254369/article/details/126023482?ops_request_misc%257B%2522request%255Fid%2522%253A%252277629891-A0F3-4EFC-B1AC-410093596085%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&req…

深入探索:AI模型在各行业的实际应用

深入探索&#xff1a;AI模型在各行业的实际应用 前言一、卷积神经网络&#xff08;CNN&#xff09;图像分类 二、循环神经网络&#xff08;RNN&#xff09;及其变体&#xff08;LSTM、GRU&#xff09;自然语言处理&#xff08;NLP&#xff09; 三、基于Transformer架构的模型&a…

基于树型结构实现顺序结构堆

目录 前言 一、树 1、树的概念与结构 2、树的相关术语 3、二叉树 4、满二叉树 ​ 5、完全二叉树 ​ 6、二叉树的存储 1、顺序结构 2、链式结构 二、堆 1、堆的结构 2、堆的初始化 3、入堆&#xff08;大根堆&#xff09; 4、出堆&#xff08;大根堆&#xf…

C++网络编程之C/S模型

C网络编程之C/S模型 引言 在网络编程中&#xff0c;C/S&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09;模型是一种最基本且广泛应用的架构模式。这种模型将应用程序分为两个部分&#xff1a;服务器&#xff08;Server&#xff09;和客户端&#xff08;Clien…

Java审计对比工具JaVers使用

最近有个需求&#xff0c;需要将页面的内容生成excel或者word文档&#xff0c;而且每次的修改都需要生成新的版本&#xff0c;同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象&#xff0c;同时存储到数据库一条新数据&#xff0c;对应数据表一…

uniapp圆形波浪进度效果

uniapp圆形波浪进度效果 背景实现思路代码实现尾巴 背景 最近项目中有些统计的地方需要用到圆形的波浪进度效果&#xff0c;要求是根据百分比值然后在一个圆形内动态的展示一个波浪形的进度&#xff0c;看参考一下效果。 实现思路 这个效果看着挺复杂的&#xff0c;那么我们…

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

索引的使用和优化

索引就是一种快速查询和检索数据的数据结构&#xff0c;mysql中的索引结构有&#xff1a;B树和Hash。 索引的作用就相当于目录的作用&#xff0c;我么只需先去目录里面查找字的位置&#xff0c;然后回家诶翻到那一页就行了&#xff0c;这样查找非常快&#xff0c; 创建一个表结…

【数据结构】宜宾大学-计院-实验五

实验五 栈和队列&#xff08;队列的基本操作&#xff09; 实验目的&#xff1a;链表结点结构&#xff1a;实验结果&#xff1a;运行截图&#xff1a;代码实现&#xff1a; 实验目的&#xff1a; 1&#xff0e;掌握队列的顺序存储结构和链式存储结构 2&#xff0e;实现队列的基…