LoadLibrary()错误代码127

Ada*_*gen 19 loadlibrary visual-c++

我在使用LoadLibrary()时遇到问题并收到一条对我没有意义的错误:

   ::SetLastError(0);

   m_hDll = ::LoadLibrary(szName);

   if (m_hDll == NULL) // Failure to load the DLL.
   {
      DWORD err = GetLastError();
   }
Run Code Online (Sandbox Code Playgroud)

错误是127("无法找到指定的过程.") 这对我调用LoadLibrary()没有任何意义. 我还没有调用GetProcaddress().

DLL(和应用程序)都使用VS ++ 2005 SP1编译.

怎么可能出错?

小智 28

让我们一步一步:

  1. 错误消息表示找到了dll但缺少必需的功能.(抖动是对的.)这意味着你有你需要的DLL,但不是正确的版本.(Davefiddes是对的,虽然问题可能是任何dll,而不仅仅是Microsoft运行时库.而且,至少对于主要更新,Microsoft为其运行时库提供了不同的名称,因此在这种情况下它不会成为问题.)

  2. 这没有意义,因为没有从被加载的DLL请求任何功能.(亚当是对的.)

  3. 因此,预期丢失的函数不会出现在LoadLibrary命令显式加载的dll中,而是出现在同时隐式加载的依赖dll中,因为第一个dll需要它.(Zebrabox很接近.)

  4. 依赖dll是一个dll,它通过导入库或.lib文件""静态"链接到显式加载的库,包含在显式加载的dll的链接器步骤中.(我打赌你不知道"动态链接库"可能是"静态链接的."嗯,现在你做了.)

  5. 如果你在不同的文件夹中有相同dll的多个版本,那么这也可能是搜索路径问题(如zebrabox建议的那样).Dll路径搜索顺序本身就是一个复杂的主题:请参阅http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx.这取决于操作系统等.在可行的情况下,最安全的做法是将所有潜在的问题dll放在与exe相同的文件夹中.

  6. 依赖的dll也可以拥有自己的依赖dll,这可能使这个问题很难解决.取决于可能会有所帮助,但如果没有,请尝试filemon.在您的错误消息之前成功读取的最后一个dll是错误的版本.


JDi*_*teo 8

Microsoft gflags工具将始终告诉您哪些依赖项无法加载以及原因.

gflags -i your_application.exe +sls.之后,在调试器下执行应用程序以捕获加载程序跟踪.

gflags是调试工具的一部分- 您可以签入C:\Program Files (x86)\Windows Kits\10\Debuggers\x64以查看是否已有它.您可以将该目录添加到路径中,或者只在cmd.exe中从该目录执行gflags.

例如,在运行gflags之后,在::LoadLibrary(_T("foo"))调用中放置一个断点并在Visual Studio输出窗口中查找加载程序错误时跳过它,例如

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
Run Code Online (Sandbox Code Playgroud)

这意味着在加载期间foo.dll,bar.dll导入了依赖项,bar.dll导入失败.

依赖项导入失败,因为?SetObject@vis_DollarMap@@QEAAXHPEAX@Z缺少该过程- 您可以将其解析public: void __cdecl vis_DollarMap::SetObject(int,void * __ptr64) __ptr64.

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


gflags -i your_application.exe -sls之后运行以禁用加载程序跟踪.


jit*_*ter 4

该错误消息意味着找到了适当的 DLL,但缺少所需的过程导出。您有正确版本的 DLL 吗?

您可以使用它dumpbin.exe来检查 DLL 导出的函数并检查拼写。

  • 我还没有调用 GetProcAddress() 。可能会缺少什么出口? (2认同)