我有一个Win32(32位)DLL项目,可以无错误地构建和链接。 DLL无法加载到32位进程。使用DependencyWalker,我看到DLL是32位,但已经与kernel32,msvcr100d,ws2_32和msvcr100的64位库链接。
DependencyWalker也显示错误
Error: Modules with different CPU types were found.
我已经对这个问题感到困惑了几个小时了,而且无法理解它 - 有没有其他人经历过这个问题,并找到了解决方案?
答案 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\")]"