LoadLibrary加载动态库失败

时间:2022-09-21 14:04:42

【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.

顺序 选择  循环 总结

LoadLibrary加载动态库失败的更多相关文章

  1. LoadLibrary加载动态库失败的解决办法

    from:http://blog.sina.com.cn/s/blog_62ad1b8101017qub.html 若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝 ...

  2. DLL中加载其它DLL使用LoadLibrary加载动态库失败的解决办法

    方式一 采用LoadLibraryEx 若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载.但若调用的DLL内部又调用另外一个DLL,此时调用 ...

  3. Windows平台LoadLibrary加载动态库搜索路径的问题

    一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...

  4. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

  5. QLibrary 加载动态库

    阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(con ...

  6. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  7. QT常用代码之加载动态库和弹出对话框

    作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...

  8. macOS下加载动态库dylib报"code signature invalid"错误的解决办法

    一.现象描述 在macOS上搞开发也有一段时间了,也积攒了一定的经验.然而,今天在替换工程中的一个动态库时还是碰到了一个问题.原来工程中用的是一个静态库,调试时发现有问题就把它替换成了动态库.这本来没 ...

  9. 使用dlopen加载动态库

    目录 概述 接口 C CMakeLists.txt src/main.c src/add.c ./dlopen_test C++ CMakeLists.txt src/main.cpp src/add ...

随机推荐

  1. win7 该任务映像已损坏或一篡改

    首先找到任务计划程序快捷方式的位置,我的是win7系统,是在:控制面板-->管理工具-->任务计划程序 打开任务计划程序出现了下面的异常提示: 出现了这个异常之后,创建任务.创建基本任务菜 ...

  2. mysql 开发基础系列21 事务控制和锁定语句(下)

    1.  隐含的执行unlock tables 如果在锁表期间,用start transaction命令来开始一个新事务,会造成一个隐含的unlock tables 被执行,如下所示: 会话1 会话2 ...

  3. JavaScript基础笔记(十四)最佳实践

    最佳实践 一)松散耦合 1.解耦HTML/JavaScript: 1)避免html种使用js 2)避免js种创建html 2.解耦CSS/JS 操作类 3.解耦应用逻辑和事件处理 以下是要牢记的应用和 ...

  4. python-随机操作(random)

    random模块作用是返回随机数,只要跟随机元素相关的,都可以使用它. Python标准库中的random函数,可以生成随机浮点数.整数.字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等 ...

  5. 【Android】adb connect 手机的两种方式

    adb支持两种连接Android系统的方式,USB方式及网络方式.一般android手机及android平板默认会设置为USB方式(直接插数据线的方式). 下边介绍两种方式的切换方式. 1. 背景知识 ...

  6. iOS UI-团购案例(通过xib文件自定义UITableViewCell)

    一.Model #import <Foundation/Foundation.h> @interface Goods : NSObject @property (nonatomic, co ...

  7. STM32F4&colon; GENERATING A SINE WAVE

    http://amarkham.com/?p=49

  8. 细节--服务器mysql空密码

    在部署致服务器的时候 发现mysql密码为空的情况 如果采用 root账户的话 试过很多 比如不写下面这行 <property name="password" value=& ...

  9. caffe template

    http://www.cnblogs.com/ggjucheng/archive/2011/12/18/2292090.html

  10. 题解报告:hdu 2072 单词数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 题目: Problem Description lily的好朋友xiaoou333最近很空,他想 ...