【发布时间】: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