64位的VC++程序似乎在32位模式下运行

10

我在Windows 7 64位系统下,使用Visual Studio 2010创建了一个64位的C++项目;

我以为运行的是一个64位的应用程序,但以下代码返回了true

bool is64bit = (sizeof(void*)==8);

但是如果我调用 IsWow64Process 函数,它会返回 FALSE...

更奇怪的事情:

  • 调用 LoadLibrary() 加载位于 c:\windows\system32\some.dll 下的 dll 可以正常工作
  • 加载位于 c:\windows\sysWow64\some.dll 下的 dll 将失败(错误代码 193: some.dll 不是有效的 Win32 应用程序)

所有这些故障表明应用程序正在以32位模式运行,但实际上指针类型为8字节长度。

我很困惑,任何帮助将不胜感激!

2个回答

10
调用LoadLibrary()在c:\windows\system32\some.dll下加载dll可以成功;在c:\windows\sysWow64\some.dll下加载dll会失败。你所说的一切都表明你正在运行64位操作系统。在Windows 64位中,System32文件夹包含DLL的64位版本,而SysWow64文件夹包含32位版本。当IsWow64Process返回TRUE时,表示你是一个32位应用程序在64位操作系统上运行。这与文件夹名称所表示的相反,这可能是为什么它看起来很困惑的原因。基本上,SysWow64文件夹是32位版本,用于WoW64,即“Windows 32位在Windows 64位上”-基本上,当你运行32位时,你使用WoW64 DLLs,而当你运行64位时,你使用普通的DLLs。

OP所描述的一切都与64位操作系统上的64位应用程序完全一致。+1 - David Schwartz
是的,人们会感到困惑,因为使用WoW64意味着你正在运行32位,这与名称所暗示的相反。 - Reed Copsey
不错的回答。意识到WoW64和system32之间的区别让我很长一段时间都感到头痛。 - nothrow
我喜欢把“Wow64”看作是“Win64上的Win32”。嗯,我并不是真的喜欢这样想,但这有助于理解。 - John Dibling

3

按下 Ctrl-Shift-Esc 键运行任务管理器应用程序。在“进程”选项卡中,您将看到每个32位进程名称旁边都有一个*32标签。 这是检查进程位数最简单的方法之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接