【问题标题】:LoadLibrary fails with error 4250: This operation is only valid in the context of an app containerLoadLibrary 失败并出现错误 4250:此操作仅在应用容器的上下文中有效
【发布时间】:2017-12-12 16:39:41
【问题描述】:

LoadLibrary("my.dll") 在使用 v120_xp 工具集在 VS 2013 中构建我的项目时返回正常。但是在带有 v141_xp 工具集(平台为 7.1)的 VS 2017 上,它返回 NULL 和错误代码 4250。我确保两次都进行了干净的构建。

我无法进入 LoadLibrary (F11)。

执行该行后,ProcessMonitor 在 CreateFileMapping 上显示 FILE LOCKED WITH ONLY READERS,在 RegQueryValue 上的 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifest 上显示 FILE LOCKED WITH ONLY READERS 和 NAME NOT FOUND,否则全部成功

my.dll 的两个版本的dumpbin /headers 相同

Dependency Walker 存在循环依赖、未解决的导出等错误,但有效的 2013 版本似乎也有相同的错误。在 VS 2017 中,my.dll 有额外的依赖 UCRTBased.dll、vcruntime140d.dll。

my.dll 与 Boost 1.64 和 TBB 静态链接,但它们都是在没有任何 Windows 存储或通用选项的情况下构建的。我正在使用 Windows 10 和 cmake 3.8。生成 VS 解决方案的 cmake 文件没有任何更改。

这是依赖walker配置文件:

LoadLibraryA("my.dll") called from "d:\myproject\x64\debug\my.EXE" at address 0x00007FF7FCED1DA2.
Loaded "d:\myproject\x64\debug\my.DLL" at address 0x00007FFA49D40000.  Successfully hooked module.
Loaded "d:\myproject\x64\debug\abc.DLL" at address 0x00007FFA45190000.  Successfully hooked module.
Loaded "c:\windows\system32\OLEAUT32.DLL" at address 0x00007FFA839F0000.  Successfully hooked module.
Loaded "c:\windows\system32\MSVCP_WIN.DLL" at address 0x00007FFA83010000.  Successfully hooked module.
Loaded "c:\windows\system32\OLE32.DLL" at address 0x00007FFA83750000.  Successfully hooked module.
Loaded "d:\myproject\x64\debug\def.DLL" at address 0x00007FFA67FD0000.  Successfully hooked module.
Loaded "d:\myproject\x64\debug\TBB_DEBUG.DLL" at address 0x00007FFA62BE0000.  Successfully hooked module.
Unloaded "d:\myproject\x64\debug\abc.DLL" at address 0x00007FFA45190000.
Unloaded "d:\myproject\x64\debug\TBB_DEBUG.DLL" at address 0x00007FFA62BE0000.
Unloaded "c:\windows\system32\MSVCP_WIN.DLL" at address 0x00007FFA83010000.
Unloaded "c:\windows\system32\OLEAUT32.DLL" at address 0x00007FFA839F0000.
Unloaded "c:\windows\system32\OLE32.DLL" at address 0x00007FFA83750000.
Unloaded "d:\myproject\x64\debug\def.DLL" at address 0x00007FFA67FD0000.
Unloaded "d:\myproject\x64\debug\my.DLL" at address 0x00007FFA49D40000.
LoadLibraryA("my.dll") returned NULL. Error: This operation is only valid in the context of an app container (4250).

【问题讨论】:

  • 忘记 Dependency Walker。它已经很久没有更新了,并且完全无法解决 Windows 7 中引入的重构系统模块。它的输出经常具有误导性。相反,显示您正在使用的代码,以及您如何确定错误代码。

标签: c++ winapi cmake visual-studio-2017


【解决方案1】:

检查程序是否从您认为的位置运行(如果您的程序本身不更改当前目录,则在项目设置的调试部分中的工作目录)。

【讨论】:

  • 是的,它是正确的目录。我可以在 processmonitor 中看到传递加载库调用,并在输出窗口中看到日志消息。它没有到达 my.dll 中的 DllMain 断点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多