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

2024-06-14 18:28

本文主要是介绍Windows中LoadLibrary加载动态库失败,详细解释(解决思路),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天在开发的过程中,需要用到动态库里的一些接口,又不希望全部载入,在这过程中使用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);

这篇关于Windows中LoadLibrary加载动态库失败,详细解释(解决思路)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061173

相关文章

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行