LoadLibrary失败的原因(转)

背影:

今天终于把公司的SDK 动态链接库转为Java 可调用的JNI 格式。DLL的编译环境是VS2010,使用Debug 输出时调用正常,而用Release 输出却调用失败。这可把哥搞惨了,开始以为是编译设置问题,找了N多方法均不得解。最后只得用哥惯用的调试手段,在DLL 里加打印消息一步步确认出错位置,然后得知是DLL 里调用公司的DLL 不成功。随后就找到了下面的方法,一试得解。非常谢该网友。

源:LoadLibrary失败的原因

今天使用LoadLibrary时,失败,于是翻了一下MSDN:

LoadLibrary The LoadLibrary function maps the specified executable module into the address space of the calling process. 
For additional load options, use the LoadLibraryEx function. 
HMODULE LoadLibrary(   LPCTSTR lpFileName   // file name of module ); Parameters lpFileName  [in] Pointer to a null-terminated string that names the executable module (either a .dll or .exe file). The name specified is the file name of the module and is not related to the name stored in the library module itself, as specified by the LIBRARY keyword in the module-definition (.def) file.  If the string specifies a path but the file does not exist in the specified directory, the function fails. When specifying a path, be sure to use backslashes (\), not forward slashes (/). 
If the string does not specify a path, the function uses a standard search strategy to find the file. See the Remarks for more information. 
Return Values If the function succeeds, the return value is a handle to the module.
If the function fails, the return value is NULL. To get extended error information, call GetLastError. 
Windows 95: If you are using LoadLibrary to load a module that contains a resource whose numeric identifier is greater than 0x7FFF, LoadLibrary fails. If you are attempting to load a 16-bit DLL directly from 32-bit code, LoadLibrary fails. If you are attempting to load a DLL whose subsystem version is greater than 4.0, LoadLibrary fails. If your DllMain function tries to call the Unicode version of a Win32 function, LoadLibrary fails.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

注意上面红色的文字,如果我们在dll的入口函数DllMain()中调用Unicode版本的系统API,则

LoadLibrary加载我们的dll文件时会失败,这就是我这次加载dll失败的原因,将API改为A版本的就

正常了,如GetModuleFileNameA

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

时间: 2024-10-16 14:48:28

LoadLibrary失败的原因(转)的相关文章

使用Unity3D是创业团队失败的原因吗?

第一个项目虽然失败了,但是最起码成功上线,并且获得了一定的收入(虽然杯水车薪),也因为第一个项目拉来了投资.但是第二个项目就彻彻底底的胎死腹中了. 没有检讨.没有总结,大家自然而然而又兴高采烈的开启了第三个项目. 我感到有些悲哀.如果我们都不知道自己的弱点在哪里,不明白自己的优势在哪里,如何能够扬长避短?一个创业团队难道靠硬推能推出一款游戏吗? 第二个项目是打算山寨<公主篷特2>,是一款<愤怒小鸟>玩法的带rpg元素的手游.<公主>就是拿Unity做的,并且有一定的3D

CentOs 6.6里kdump启动失败的原因

在VMware中新安装了CentOs 6.6,重启系统发现kdump服务启动失败 先来说一下,什么是kdump kdump 是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump 使用 kexec 启动 到第二个内核.第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像.第一个内核保 留了内存的一部分给第二内核启动用.由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所 以第一个内核的内存得以保留.这是内核崩溃转储的本质. 启动失败的原因 查看 /etc

系统启动失败的原因分析及解决办法

系统启动失败的原因分析及解决办法 原因分析: 可能是配置文件/etc/fstab中错误了. 查看/etc/fstab配置文件内容: [[email protected] ~]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Mon Nov  7 18:40:55 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See

无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:

无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”.此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错. (异常来 自 HRESULT:0x80029C4A (TYPE_E_CANTLOADLIBRARY)) 经过多般折腾,还是没什么更好的办法.

adb 启动失败的原因和修改adb端口号

在我们使用Android Studio的时候,有时候就会出现adb打开失败或者启动不了的情况. adb 启动失败的原因:有其他程序占用了adb默认启动的端口号(像我就遇到过,每次只要提前启动了酷狗音乐,adb就会启动失败~这是要我们专心写代码,不要边听歌边撸0.0) 打不开的情况下的解决方案就是打开Android Studio的Terminal终端 使用以下命令: //关闭adb服务 adb kill-server //再重启adb服务 adb start-server 结果:(终端输出以下代码

数据库连接失败的原因及解决方法

各种业务系统在使用过程中都会遇到一些问题,因数据库连接失败,不能登录管理软件就是其中之一,这个很令人头疼而且常见的问题 一般的业务系统均采用的是SQL数据库,我们这里总结了SQL数据库连接失败的原因和解决方法: 原因一:登录账号.密码.服务器名称.数据库名称登录错误导致不能连接,这个比较常见,仔细检查好所填信息是否正确,填写正确一般就可以解决. 解决方法:当正在使用的软件出现数据库不能连接时,一般就是服务器名出现问题,更改服务器名称一般可以解决问题.数据库如果是安装在本机,服务器名可以用".&q

linux下使用crontab实现定时PHP计划任务失败的原因分析

这篇文章主要介绍了linux下使用crontab实现定时PHP计划任务失败的原因分析,需要的朋友可以参考下 很多人在linux下使用crontab实现PHP执行定时任务却未能成功,不能生成缓存.本文就linux下使用crontab实现定时PHP计划任务失败的原因做一分析. 一般我们linux定时执行php代码例如: 1 */5 * * * * /usr/local/php/bin/php /home/wwwroot/1.php 其实这样是可以执行php代码的. 但是为什么很多朋友在1.php写的

检索 COM 类工厂中 CLSID 为 {5374EC4C-1AA2-4829-A811-DE624ECEC23F} 的组件时失败,原因是出现以下错误: 80040154。

1.开发环境: win7 64位,vs2008,AE9.3 控制台程序 new方法失效报出的错误. 2.出现问题: 检索 COM 类工厂中 CLSID 为 {5374EC4C-1AA2-4829-A811-DE624ECEC23F} 的组件时失败,原因是出现以下错误: 80040154. 3.解决方案:将工程的属性中生成选项的目标平台设置为x86就可以了.

VC断点失败的原因之一

VC断点失败的原因之一 flyfish 2014-10-23 情景 再debug状态下只有一个cpp文件,命中不了断点. 提示 可以 允许源代码与原始版本不同 不采用,防止出现未知的隐患 问题分析 1 头文件(.h)和实现文件(.cpp),经过编译生成OBJ文件,OBJ文件通过连接(Link)生成EXE文件 简化: .h+.cpp -> obj -> exe 2 PDB文件存储了EXE文件的所有调试信息,每当生成OBJ 文件时,编译器都会将调试信息合并到PDB 中 简化: .h+.cpp -&