Visual c++ 为什么MSVC 2010 32位项目链接到64位内核32.dll?

Visual c++ 为什么MSVC 2010 32位项目链接到64位内核32.dll?,visual-c++,linker,32bit-64bit,visual-studio-2010,Visual C++,Linker,32bit 64bit,Visual Studio 2010,我有一个Win32(32位)DLL项目,它构建和链接时不会出错。DLL无法加载到32位进程中。使用DependencyWalker,我看到DLL是32位的,但是已经与内核32、msvcr100d、ws2_32和msvcr100的64位库相链接 DependencyWalker也显示了一个错误 Error: Modules with different CPU types were found. 我已经为这个问题困惑了几个小时,只是无法理解——还有其他人经历过这个问题并找到了解决方案吗?Depe

我有一个Win32(32位)DLL项目,它构建和链接时不会出错。DLL无法加载到32位进程中。使用DependencyWalker,我看到DLL是32位的,但是已经与内核32、msvcr100d、ws2_32和msvcr100的64位库相链接

DependencyWalker也显示了一个错误

Error: Modules with different CPU types were found.

我已经为这个问题困惑了几个小时,只是无法理解——还有其他人经历过这个问题并找到了解决方案吗?

Dependency Walker没有使用与操作系统相同的搜索路径。它有自己的搜索路径来尝试查找DLL。您可以通过进入“选项->配置模块搜索顺序…”查看此信息

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

这就是为什么Dependency Walker错误地认为您的应用程序将x64 DLL与x86应用程序混合

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


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

简短回答:对于x86内容,请使用依赖项Walker

详细回答:最初,我在MS Windows 7操作系统上使用了适用于x64的依赖性Walker,遇到了您遇到的障碍。然后我听从了梅里科娃关于改变搜索路径的建议(谢谢梅里科娃)。尽管我仍然有一些依赖项导致“错误:找到了具有不同CPU类型的模块”


我没有弄清楚如何配置Dependency Walker以在类似“c:\windows\winsxs\amd64\u microsoft.windows.gdiplus\u 6595b64144ccf1df_1.1.7601.17514\u none\u 2b24536c71ed437a\gdiplus.DLL”的奇怪路径中搜索x86 DLL,而是正确地使用了x86的Dependency Walker。对我来说工作很有魅力

查看依赖项网站常见问题解答

32位模块需要使用x86版本,64位模块需要使用x64版本。这意味着您需要在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\")]"

我意识到这是一个老问题,但我这样做没有问题。你能告诉我更多关于你的设置吗?具体来说,您是否已在Linker->Advanced下将目标机器设置为MachineX86?在目标机器上运行依赖项walker而不是在开发机器上运行依赖项walker通常也会有所帮助。您甚至可以创建一个批处理文件,将其输出转储到文本文件中,并让友好的测试人员通过电子邮件发送给您。此外,Dependency Walker似乎无法处理从.Net C#程序开始到本机DLL的跟踪。在你的.exe和你负责的每一个.dll上运行Dependency walker。我知道这是一篇老文章,但是“没有弄清楚怎么做…”?
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\")]"