LoadLibrary加载动态库失败

LoadLibrary加载动态库失败【1】LoadLibrary加载动态库失败的可能原因以及解决方案:(1)dll动态库文件路径不对。此场景细分为以下几种情况:1.1文件路径的确错误。比如:本来欲加载的是A文件夹下的动态库a.dl

大家好,又见面了,我是你们的朋友全栈君。

【1】LoadLibrary加载动态库失败的可能原因以及解决方案:

(1)dll动态库文件路径不对。此场景细分为以下几种情况:

1.1 文件路径的确错误。比如:本来欲加载的是A文件夹下的动态库a.dll,但是经过仔细排查原因,发现a.dll动态库竟然被拷贝到B文件夹下去了。

若真遇到这种低级错误,建议你找个没人的墙角蹲下用小拇指逆时针划圈圈去吧。。。

1.2 实参传值错误。比如:实参类型为LPCWTR,经常都会因为字符串转换导致实参事与愿违。

网上的经验总结实例。某程序员经过一番周折后通过以下语句调用成功

hDll = LoadLibrary(TEXT(“user32.dll”));

再经过一番百度google后发现,原来是字符格式惹的祸。

这里的LoadLibrary实际使用了LoadLibraryW而非LoadLibraryA,因此需要UNICODE字符串(宽字符串),而非窄字符串。 如下:

#ifdef UNICODE

#define LoadLibrary  LoadLibraryW

#else

#define LoadLibrary  LoadLibraryA

#endif // !UNICODE

在C/C++代码中,直接使用””定义的字符串为窄字节串,而windows头文件中提供的TEXT宏可以根据是否定义了UNICODE宏来自动选择字符串类型。

因此,利用TEXT宏使其自动选择了正确的字符集,dll调用成功。

(2)dll里有全局变量初始化失败或dllmain函数返回false。这种情况需要根据自己的业务代码具体分析排除与定位。

(3)64位进程调用了32位dll动态库的问题。

微软公司的官方网站针对这个问题描述如下:

在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一个64位dll。

如果您真都没有源码,只能如此“尴尬”的想正常运行,可以参见资料《64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考》

(4)其他原因

4.1 LoadLibrary函数跟LoadLibraryEx函数装载dll的机制不一样,前者在装载dll遇到与该dll依赖的其他dll时会自动装载,而后者不会。

网上有加载自己的dll无法成功的例子,排除路径问题的话(最好全路径),就要考虑该dll是否依赖到其它的dll。

 

Good Good Study, Day Day Up.

顺序 选择  循环 总结

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154368.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Office2010序列号_序列号被更换能升级吗

    Office2010序列号_序列号被更换能升级吗Office2010修改|更改|更换序列号的办法http://blog.csdn.net/microtong佟强2010年9月27日Office2010安装的时候,填了个序列号,安装成功了。但是后来激活没有成功。怎么更换序列号呢?进入控制面板,选择程序和功能,找到Office2010,点击右键,选择更改,参看下图。

    2025年5月22日
    3
  • oracle存储过程语法与使用

    oracle存储过程语法与使用oracle存储过程的基本语法1.基本结构  1CREATEORREPLACEPROCEDURE存储过程名  2IS  3BEGIN  4NULL;  5END;行1:CREATEORREPLACEPROCEDURE是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程,如果存在就覆盖它;行2:  IS关键词表明后面

    2022年7月17日
    20
  • UML类图关系全面剖析

    UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)。而其中关联又分为双向关联、单向关联、自身关联;下面就让我们一起来看看这些关系究竟是什么,以及它们的区别在哪里。1、关联双向关联:

    2021年12月25日
    88
  • 使用pycharm创建Django项目[通俗易懂]

    使用pycharm创建Django项目[通俗易懂]创建项目1.使用命令行创建项目如果这是你第一次使用Django的话,你需要一些初始化设置。也就是说,你需要用一些自动生成的代码配置一个Djangoproject——即一个Django项目实例需要的设置项集合,包括数据库配置、Django配置和应用程序配置。打开命令行,cd到一个你想放置你代码的目录,然后运行以下命令:django-adminstartprojectmysite#mysite是项目名这行代码将会在当前目录下创建一个mysite目录。如果命令失

    2022年8月25日
    8
  • com.jcraft.jsch.JSchException: Auth fail

    背景服务器信息: 服务器A:10.102.110.1 服务器B:10.102.110.2 需要从服务器A通过Sftp传输文件到服务器B。应用项目中有一个功能,要通个关Sftp进行日志文件的传输,在部署的时候,服务器之间已经配置了免认证(密),也就sftp免密登录,但是部署完项目后,启动服务,在需要传输的时候还是报了下面的错误: com.jcraft.jsch.JSchExcep…

    2022年2月27日
    340
  • tp5 $_ENV获取不到数据

    tp5 $_ENV获取不到数据

    2021年10月13日
    91

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号