zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    《C语言程序设计》指针篇<一>
    《算法竞赛入门经典》刘汝佳 C语言部分(前四章)“注解与习题” 之思索 -<1>
    程序设计第二次作业<2>
    程序设计第二次作业<1>
    第一次面向对象程序设计作业-大一下学期的自我目标
    android部署tensorflow
    vim操作
    跑groud truth的disparity
    tensorflow与android编译
    Ubuntu ndk环境变量配置
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4561186.html
Copyright © 2011-2022 走看看