【问题标题】:Why does MSVC 2010 32bit project link to 64bit kernel32.dll?为什么 MSVC 2010 32 位项目链接到 64 位 kernel32.dll?
【发布时间】:2011-08-31 11:40:30
【问题描述】:

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

DependencyWalker 也显示错误

Error: Modules with different CPU types were found.

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

【问题讨论】:

  • 我意识到这是一个较老的问题,但我这样做没有问题。你能告诉我更多关于你的设置吗?具体你有没有在 Linker->Advanced 下将 Target Machine 设置为 MachineX86?

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


【解决方案1】:

简答:对 x86 的东西使用 Dependency Walker for x86

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

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

【讨论】:

  • 在目标而不是开发上运行依赖walker,机器通常也很有帮助。您甚至可以创建一个批处理文件,将其输出转储到文本文件中,并让友好的测试人员通过电子邮件将其发送给您。此外,Dependency Walker 似乎没有处理从 .Net C# 程序开始到本机 dll 的跟踪。在您的 .exe 和您负责的每个 .dll 上运行 Dependency walker。
  • 我知道这是一篇旧帖子,但是,“而不是弄清楚如何......”?
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    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\")]"
    

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2018-05-29
      • 1970-01-01
      • 2011-09-02
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多