为什么MSVC 2010 32bit项目链接到64bit kernel32.dll?

时间:2011-05-23 21:24:25

标签: visual-c++ linker 32bit-64bit visual-studio-2010

我有一个Win32(32位)DLL项目,可以无错误地构建和链接。 DLL无法加载到32位进程。使用DependencyWalker,我看到DLL是32位,但已经与kernel32,msvcr100d,ws2_32和msvcr100的64位库链接。

DependencyWalker也显示错误

Error: Modules with different CPU types were found.

我已经对这个问题感到困惑了几个小时了,而且无法理解它 - 有没有其他人经历过这个问题,并找到了解决方案?

3 个答案:

答案 0 :(得分:13)

简答:对x86使用依赖Walker for x86

长答案:最初我在MS Windows 7操作系统上使用了依赖Walker for x64 并遇到了障碍。然后我遵循MerickOWA关于改变搜索路径的建议(感谢MerickOWA)。虽然我仍然有一些依赖项导致“错误:找到了具有不同CPU类型的模块”。

我没有弄清楚如何配置Dependency Walker来正确搜索奇怪的路径中的x86 DLL,例如“c:\ windows \ winsxs \ amd64_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.7601.17514_none_2b24536c71ed437a \ GDIPLUS.DLL”,我使用了 x86的依赖性Walker 。对我来说就像一个魅力!

答案 1 :(得分:6)

Dependency Walker未使用与操作系统相同的搜索路径。它有自己的搜索路径来尝试查找DLL。您可以转到“选项 - >配置模块搜索订单...”

来查看此内容

不幸的是它的搜索路径不包括“C:\ Windows \ SysWow64”(Kernel32.dll的32位版本的位置)

这就是Dependency Walker错误地认为您的应用程序正在将x64 DLL与x86应用程序混合的原因。

如果您修改搜索顺序以包含SysWow64并删除对System32目录的所有引用。这个错误应该消失。

运行应用程序时检查Visual Studio调试器或WinDbg的输出窗口的更好方法。它将在加载时列出DLL的完整路径。

答案 2 :(得分:3)

查看依赖网站常见问题解答。 http://www.dependencywalker.com/faq.html

Q.Will Dependency Walker work with 64-bit modules?

您需要将x86版本用于32位模块,将x64用于64位模块。这意味着您需要在64位操作系统中拥有2份副本并相应地使用它们。

您可以使用Windows注册表创建上下文菜单,以便省去这样的麻烦。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\dllfile\shell]

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies]

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\depends.exe /dde"

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies(32bit)]

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies(32bit)\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\x86\\depends.exe /dde"

[HKEY_CLASSES_ROOT\dllfile\shell\View Dependencies(32bit)\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\exefile\shell]

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies]

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\depends.exe /dde"

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies\ddeexec]
@="[open(\"%1\")]"

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies(32bit)]

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies(32bit)\command]
@="\\\\psf\\Public\\Library\\DEPE~K17\\x86\\depends.exe /dde"

[HKEY_CLASSES_ROOT\exefile\shell\View Dependencies(32bit)\ddeexec]
@="[open(\"%1\")]"