【问题标题】:Runtime error (dll loading) with win32 applications on x64 system, while compiling 0Kx64 系统上的 win32 应用程序运行时错误(dll 加载),同时编译 0K
【发布时间】:2011-03-21 00:10:20
【问题描述】:

我最初在win7 32bits上设计了一个win32应用程序,用VC9.0。 我最近升级到win7 64位,并尝试构建+执行之前的应用程序。

构建运行良好(win32 应用程序),但在运行时出现错误“[...] has exited with code -1073741701 (0xc000007b)。”

我猜这是加载 [预期] 32 位 dll 的 64 位版本的结果。

此项目的具体依赖项是: SDL.lib SDLmain.lib SDL_ttf.lib opengl32.lib glu32.lib wininet.lib

SDL 和 SDL_ttf 仅在 32 位版本中。 我假设 Visual Studio 足够聪明,可以在我请求 win32 应用程序时获取 \syswow64 中的 opengl 和 glu lib 文件。

会不会是因为wininet?还是我弄错了?

谢谢,

【问题讨论】:

  • 你猜?所以你还没有真正尝试过调试它?您是否至少使用 Dependency Walker 进行了检查?
  • 那是 STATUS_INVALID_IMAGE_FORMAT,您不能将 32 位 DLL 加载到 64 位进程中。猫和狗。
  • 确实是猜测。我是一个新手,不熟悉这类问题。猫和狗,有效。

标签: c++ dll 64-bit binary-compatibility wow64


【解决方案1】:

您似乎正在将 64 位 DLL 加载到 32 位进程中,反之亦然。以下是我将如何追踪有问题的 DLL。

第一步是在可执行文件上运行 dumpbin.exe(使用 VS 命令提示符在 PATH 上获取它)以确保体系结构符合您的预期:dumpbin.exe /headers foo.exe。在文件头输出中,您应该看到“x86”或“x64”的“机器”值。在可选的标头输出中,您应该看到“PE32”(x86)或“PE32+”(x64)的魔力。

下一步是根据可执行文件的体系结构(x86 或 x64)运行适当的依赖项遍历器,可在 www.dependencywalker.com 获得。该工具应该会告诉您它是否在搜索路径上找到了不属于同一架构的依赖项。

如果dependency walker 发现问题,则修复方法是用相同架构的库替换有问题的库,或者根据搜索路径确保正确的库位于不正确的库之前。

【讨论】:

  • 感谢您的跟踪方法。 Dumpbin 报告了 x86 的机器值和 PE32 的魔法值。 Dependency walker 报告加载了 x64 架构的 ZLIB1.dll。怎么会?老实说,我什至不知道这个 dll 是干什么用的。可能你能对此有所了解吗?谢谢。
  • 我忘了,ZLIB1.dll (x64) 是由 LIBFREETYPE-6.dll (x86) 请求的,这与我在 Dependency Walker 中看到的 [和理解] 一致。
  • zlib1.dll 当前安装在哪里?尝试用 32 位版本替换它,看看是否能解决您的问题。
  • 它在 ProgramFiles/Intel/Wifi/bin 中。显然用 32 位版本替换它就可以了。但我很想知道为什么要这个 dll!无论如何,至少 Dependency Walker 指出了罪魁祸首。那么谢谢!
  • 我猜这只是你的应用程序所依赖的东西的正常依赖。安装程序可能会修改 PATH 以指向此目录(%ProgramFiles% 用于 64 位软件;%ProgramFiles(x86)% 用于 32 位软件),而您恰好选择了 64 位版本。您可能不想用 32 位版本替换这个库,因为它可能会破坏依赖它的东西。相反,我只需将 32 位版本本地复制到您的应用程序。应该没什么好担心的。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2020-04-10
  • 2015-09-11
  • 2012-11-07
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多