Windows中LoadLibrary加载动态库失败,详细解释(解决思路)

news2025/9/19 2:30:51

今天在开发的过程中,需要用到动态库里的一些接口,又不希望全部载入,在这过程中使用LoadLibrary加载dll时,出现问题,特此记录一下自己怎么解决的思路。

目录

先介绍一下这几个函数为以下错误分析做准备

GetProcAddress 函数

GetProcAddress 函数

FreeLibrary 函数

一、文件路径错误

二、编码传值问题

三、动态库不匹配

四、排错函数的使用

1、用VS自带的命令,找到下图的这个双击打开

2、如下图,执行了后,在你设置的对应路径去查找这个文件

3、下图就是输出的文件,进进去查看就知道是否依赖了其它dll动态库

4、当有依赖其它动态库,怎么办,我现在介绍另一个函数

LoadLibraryEx


先介绍一下这几个函数为以下错误分析做准备

GetProcAddress 函数

[格式]:

function LoadLibrary(LibFileName : PChar): Thandle;

[功能]:加载由参数 LibFileName 指定的 DLL 文件。

[说明]:参数 LibFileName 指定了要装载的 DLL 文件名,如果 LibFileName 没有包含一个路径,系统将按照:当前目录、Windows 目录、Windows 系统目录、包含当前任务可执行文件的目录、列在 PATH 环境变量中的目录等顺序查找文件。

如果函数操作成功,将返回装载 DLL 库模块的实例句柄,否则,将返回一个错误代码,错误代码的定义如引文[1]所示。

GetProcAddress 函数

[格式]:

function GetProcAddress(Module:Thandle; ProcName:PChar): TfarProc;

[功能]:返回参数 Module 指定的模块中,由参数 ProcName 指定的过程或函数的入口地址。

[说明]:参数 Module 包含被调用函数的 DLL 句柄,这个值由 LoadLibrary 返回, ProcName
是指向含有函数名的以 nil 结尾的字符串指针,或者可以是函数的次序值,但大多数情况下,用函数名是一种更稳妥的选择。如果该函数执行成功,则返回 DLL 中由参数 ProcName 指定的过程或函数的入口地址,否则返回 nil 。

FreeLibrary 函数

[格式]:

procedure FreeLibrary(Module: Thandle);

[功能]:将由参数 Module 指定的 DLL 文件从内存中卸载 1 次。

[说明]:Module 为 DLL 库的句柄。这个值由 LoadLibrary 返回。由于 DLL 在内存中只装载一次,因此调用 FreeLibrary 首先使 DLL 的引用计数减 1,如果计数减为 0 则卸载该 DLL。

[注意]:每调用一次 LoadLibrary 函数就应调用一次 FreeLibrary 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。

一、文件路径错误

传入LoadLibrary的路径有问题,仔细排查路径是否错误。可以先用绝对路径试一试,再尝试能不能链接到。

二、编码传值问题

传入LoadLibrary的参数必须为LPCWTR类型,当你传入的类型不匹配可能发生错误,仔细核对你当前的编码问题。

三、动态库不匹配

这里的动态库指的,你的程序64位进程调用了32位dll动态库。

四、排错函数的使用

当你运行完这条语句,再下面再次运行std::cout << GetLastError();语句,用来返回错误码,根据错误码查找对应的文档,判断对应的错误。

LoadLibrary(path);
std::cout << GetLastError();

一般而言错误代码为"126",查找对应的错误代码表,发现错误"126"是指"找不到指定的模块",这时候就分析了,为什么会出现这种错误,经过分析,发现如果你的dll动态库里面依赖了其它dll动态库应该用另一个接口LoadLibraryEx,这里给出分析dll动态库怎么找到它对应依赖的dll动态库的方法。

1、用VS自带的命令,找到下图的这个双击打开

2、如下图,执行了后,在你设置的对应路径去查找这个文件

命令格式:

dumpbin -imports 路径\MyDll.dll > 路径\result.txt   (>指的是这个dll依赖查看文件输出到哪个路径)

3、下图就是输出的文件,进进去查看就知道是否依赖了其它dll动态库

4、当有依赖其它动态库,怎么办,我现在介绍另一个函数

LoadLibraryEx

若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用 LoadLibraryEx,通过指定 LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。

LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

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

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

相关文章

使用asyncua模块如何在opcua框架的Server端添加方法及在Client端调用方法

1. 在opcua框架的Server端添加方法 参考文章&#xff1a; freeopcua调用方法输入参数| Python解析数组到输入列表 为OPC UA python服务器/客户端添加安全性&#xff08;异步&#xff09; OPCUA和asyncua — [3] 添加方法 OPC UA的Server端新增方法的关键代码如下&#xff1a;…

如何评估员工在新版FMEA培训后应用知识的效果?

随着制造业的快速发展&#xff0c;新版FMEA已成为企业提升产品质量、减少故障风险的关键一环。然而&#xff0c;培训只是第一步&#xff0c;如何有效评估员工在新版FMEA培训后应用知识的效果&#xff0c;才是确保培训成果转化的关键所在。 评估员工知识应用效果的首要步骤是制定…

[深度学习]基于C++和onnxruntime部署yolov10的onnx模型

基于C和ONNX Runtime部署YOLOv10的ONNX模型&#xff0c;可以遵循以下步骤&#xff1a; 准备环境&#xff1a;首先&#xff0c;确保已经下载后指定版本opencv和onnruntime的C库。 模型转换&#xff1a;按照官方源码&#xff1a;https://github.com/THU-MIG/yolov10 安装好yolov…

揭秘裂变客户背后的心理学:如何触动用户分享欲望?

在当今的社交媒体时代&#xff0c;裂变客户——即用户主动分享并推广某一产品或服务&#xff0c;已成为企业营销的重要策略。那么&#xff0c;如何触动用户的分享欲望呢&#xff1f;这背后其实隐藏着深刻的心理学原理。本文将以looka这个知名的国外设计工具为例&#xff0c;为s…

最新下载:EasyRecovery易恢复软件安装视频教程

EasyRecovery电脑数据丢失如何恢复?有时候我们在清理电脑的时候会不小心把一些文件夹的数据误删了&#xff0c;在数据恢复时大家会寻找一些数据恢复软件&#xff0c;比如Easyrecover数据恢复软件&#xff0c;但是许多小伙伴还不知道要怎么操作&#xff0c;文件恢复的操作和原理…

有什么好用的ai智能写作手机版?6个软件帮助你快速进行智能写作

有什么好用的ai智能写作手机版&#xff1f;6个软件帮助你快速进行智能写作 AI智能写作在现代社会中扮演着越来越重要的角色&#xff0c;许多人依赖这些工具来提高写作效率和质量。以下是六款不同类型的AI智能写作手机应用&#xff0c;它们可以帮助你快速进行智能写作&#xff…

3X+3问题,角谷猜想的姐妹问题

3X3问题是角谷猜想&#xff08;3X1&#xff09;的延伸&#xff0c;可以说是孪生问题。 对于任何奇数x&#xff0c;乘以3再加3&#xff0c;再析出偶数&#xff0c;即&#xff0c;除以&#xff08;m1&#xff0c;2&#xff0c;3&#xff0c;...。&#xff09;&#xff0c;&#x…

借助ollama实现AI绘画提示词自由,操作简单只需一个节点!

只需要将ollama部署到本地&#xff0c;借助comfyui ollama节点即可给你的Ai绘画提示词插上想象的翅膀。具体看详细步骤&#xff01; 第一步打开ollama官网&#xff1a;https://ollama.com/&#xff0c;并选择models显存太小选择的是llama3\8b参数的instruct-q6_k的这个模型。 运…

Ubuntu18.04 安装 colmap

安装依赖 sudo apt-get install \git \cmake \ninja-build \build-essential \libboost-program-options-dev \libboost-filesystem-dev \libboost-graph-dev \libboost-system-dev \libeigen3-dev \libflann-dev \libfreeimage-dev \libmetis-dev \libgoogle-glog-dev \libgt…

GenICam标准(一)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; 文章目录 系列文章目录1、概述GenApiGenTLSFNC&#xff08;标准特征命名约定&#xff09;CLProtocolGenCP 参考 emva 1、概述 如今的数码摄相机包含了很多的功能&#xff0c;而不仅…

为什么Mamba模型被拒?

Mamba模型问世 最近&#xff0c;国际学习表征会议&#xff08;ICLR&#xff09;公布了2024年会议的最终决定&#xff0c;其中引起广泛关注的是一个名为Mamba的模型。这个模型最初被认为是对抗著名的Transformer架构进行语言建模任务的主要竞争者&#xff0c;但最终被拒绝&…

植物大战僵尸杂交版 fatal error及问题解决闪退

echo off set KEY_NAMESoftware\PopCap\PlantsVsZombies set VALUE_NAMEScreenmode set DATA0 reg add HKCU%KEY_NAME% /v %VALUE_NAME% /t REG_DWORD /d %DATA% /f if %errorlevel% neq 0 ( echo 注册表数值数据修改失败 ) else ( echo 注册表数值数据已成功修改为0 ) 将上述…

什么是场外期权?场外期权有几种做法?

今天带你了解什么是场外期权&#xff1f;场外期权有几种做法&#xff1f;期权分为场内期权&#xff0c;场外期权。场内期权我们都知道&#xff0c;是在期货盘里购买的期权&#xff0c;但场外期权呢&#xff1f; 什么是场外期权&#xff1f; 场外期权是一种在交易所之外进行交易…

组件二次封装,通过属性事件透传,插槽使用,组件实例方法的绑定,深入理解 Vue.js 组件扩展与插槽

透传&#xff0c;插槽&#xff0c;组件实例方法的绑定&#xff0c;深入理解 Vue.js 组件扩展与插槽 前言 Vue.js 提供了强大的组件化系统&#xff0c;允许开发者构建可复用、可组合的UI组件。在实际项目中&#xff0c;直接使用第三方库提供的基础组件&#xff08;如Element UI…

DBA必备!如何使用DBdoctor进行索引推荐

近期&#xff0c;一些用户在安装DBdoctor并完成实例纳管后&#xff0c;常在DBdoctor概览页面或实例性能洞察页面看到索引推荐的相关信息&#xff0c;他们对这些信息的来源、索引推荐的触发场景以及实现流程等比较关注&#xff0c;也想了解是否存在其他能够触发索引推荐的场景。…

【Hive中篇: 一篇文章带你了解表的静态分区,动态分区! 分桶!Hive sql的内置函数!复杂数据类型!hive的简单查询语句!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本篇文章主要分享的是大数据开发中hive的相关技术&#xff0c;表的静态分区&#xff0c;动态分区&#xff0c;分桶&#xff01;Hive sql的内置函数&#xff01;复杂数据类型&#xff01;以…

优雅谈大模型11:Mistral

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

android studio4.1后不能ButterKnife

麻蛋L最近发现 android studio不能使用ButterKnife啦&#xff01;ButterKnife Injections不维护&#xff0c;butterknife Zelezny也不维护&#xff01;&#xff01;&#xff01;日…难受&#xff0c;兄弟们换下一家&#xff1a;IDsCreate&#xff0c;一毛一样的好用&#xff01…

2024年计算机科学与电子信息工程国际会议(ICSEIE 2024)

2024 International Conference on Computer Science and Electronic Information Engineering 【1】大会信息 会议简称&#xff1a;ICSEIE 2024 大会时间&#xff1a;2024-07-19 大会地点&#xff1a;中国苏州 截稿时间&#xff1a;2024-07-05(以官网为准&#xff09; 审稿通…

git提交错了?别慌,直接删除提交记录

git revert 和git reset &#xff01;这两个命令都有撤销操作的功能&#xff01;哪一个可以删除提提交记录&#xff1f;&#xff1f;&#xff1f; 使用git revert撤销提交 revert的英文释义是回复、恢复&#xff08;到原来的状态&#xff09; 作用 git revert 是 Git 中用于撤…