代码之家  ›  专栏  ›  技术社区  ›  Adam Tegen

LoadLibrary()错误代码127

  •  16
  • Adam Tegen  · 技术社区  · 17 年前

    我在LoadLibrary()时遇到问题,并得到一个对我来说没有意义的错误:

       ::SetLastError(0);
    
       m_hDll = ::LoadLibrary(szName);
    
       if (m_hDll == NULL) // Failure to load the DLL.
       {
          DWORD err = GetLastError();
       }
    

    对LoadLibrary()的调用没有任何意义。 我还没有调用GetProcaddress()。

    DLL(和应用程序)都是用VS++2005SP1编译的。

    会出什么问题?

    8 回复  |  直到 17 年前
        1
  •  31
  •   Michael    16 年前

    让我们一步一步来:

    1. 这没有意义,因为没有从正在加载的dll中请求任何函数。(亚当是对的。)

    2. 依赖dll是一个通过导入库或.lib文件“静态”链接到显式加载的库的dll,该库包含在显式加载的dll的链接器步骤中。(我敢打赌你不知道“动态链接库”可以是“静态链接库”。现在你知道了。)

    3. 如果在不同的文件夹中有同一dll的多个版本,那么这也可能是一个搜索路径问题(正如zebrabox建议的那样)。Dll路径搜索顺序本身就是一个复杂的主题:请参阅 http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx

    4. 依赖dll也可以有自己的依赖dll,这使得这个问题很难解决。Depends可能会有帮助,但如果不起作用,请尝试filemon。在错误消息之前成功读取的最后一个dll是版本错误的dll。

        2
  •  11
  •   JDiMatteo    10 年前

    微软 gflags

    gflags -i your_application.exe +sls loader traces .

    Debugging Tools --你可以登记入住 C:\Program Files (x86)\Windows Kits\10\Debuggers\x64 看看你是否已经有了。您可以将该目录添加到您的路径中,或者从中的该目录执行gflags命令提示符.

    例如,在运行gflags之后,在 ::LoadLibrary(_T("foo")) 调用并跳过它,同时在visualstudio输出窗口中查找加载程序错误,例如。

    4b00:396c @ 479194074 - LdrpSnapThunk - ERROR: Procedure "?SetObject@vis_DollarMap@@QEAAXHPEAX@Z" could not be located in DLL "bar.dll"
    First-chance exception at 0x0000000077307EF8 (ntdll.dll) in your_application.exe: 0xC0000139: Entry Point Not Found.
    4b00:396c @ 479194074 - LdrpGenericExceptionFilter - ERROR: Function LdrpSnapIAT raised exception 0xc0000139
        Exception record: .exr 0000000000129070
        Context record: .cxr 0000000000128B80
    4b00:396c @ 479194074 - LdrpHandleOneOldFormatImportDescriptor - ERROR: Snapping the imports from DLL "C:\test\64Debug\foo.DLL" to DLL "C:\test\64Debug\bar.dll" failed with status 0xc0000139
    

    foo.dll ,依赖关系 bar.dll 酒吧.dll

    ?SetObject@vis_DollarMap@@QEAAXHPEAX@Z 失踪了——你可以 demangle public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64

    您可能有一个错误版本的依赖项——也许您需要重新构建该依赖项以使其更新。


    gflags -i your_application.exe -sls 然后禁用加载程序跟踪。

        3
  •  4
  •   jitter    17 年前

    错误消息表示找到了适当的DLL,但缺少必需的过程导出。你有正确版本的DLL吗?

    你可以用 dumpbin.exe 检查DLL导出的函数并检查拼写。

        4
  •  4
  •   Dmitri Zhuchkov    14 年前

    安装调试工具并运行 gflags -i your_application.exe +sls . 然后在调试器下执行应用程序以捕获加载程序跟踪。

        5
  •  2
  •   davefiddes    17 年前

    你的应用程序和DLL使用的运行时是否不匹配?

    过去VS2005困扰我的一个问题是,一部分构建为发布版本,另一部分构建为调试版本。这些插件引入了不同版本的Microsoft运行时DLL,这些版本不兼容,因为在给定的进程中只能加载一个。

        6
  •  2
  •   zebrabox    17 年前

    我猜了两次

    2LoadLibrary将加载指定的DLL及其所有依赖项。因此,如果DLL的一个依赖模块不能在搜索路径中找到,这将导致加载失败-您可以使用依赖.exe检查-可用 here

        7
  •  0
  •   Jatin Sanghvi    15 年前

        8
  •  0
  •   Damian Dixon    13 年前

    我建议使用 Dependency Walker 找出缺少哪个方法,需要或缺少哪些dll。

        9
  •  0
  •   Ivan Baidakou    6 年前

    同名 (即。 server.dll ),但位于不同的路径上。

    client.dll 装载了 LOAD_WITH_ALTERED_SEARCH_PATH 服务器.dll 服务器.dll 当然是成功加载的)。

    解决方案非常简单:让加载的DLL具有唯一的名称,即 server-1.dll server-2.dll