【发布时间】:2019-05-16 06:15:44
【问题描述】:
我发现了一个我无法解释的行为,我希望有人向我解释为什么会这样。
为了恢复我的情况,我正在尝试使用 VirtualQueryEx 将内存区域读取到 64 位程序 (notepad.exe)
我已经弄清楚了:
- 使用 MEMORY_BASIC_INFORMATION32 结构 msdn doc 从 32 位进程我只能读取 32 位进程
- 从 64 位进程我可以使用 MEMORY_BASIC_INFORMATION64 结构 msdn doc 读取 64 位和 32 位进程
- 从 "Any CPU" 配置中,我得到的性能与将程序作为 x86 32 位程序运行时完全相同。
那么我的问题是:为什么? 我的意思是,我查看了 msdn 文档,他们说它应该正常运行在 64 位模式下,因为我的计算机是 64 位操作系统。那为什么它表现得像一个 32 位进程呢?
非常感谢您对未来的回答。我真的很想知道。
【问题讨论】:
-
听起来您的代码以 32 位运行,例如。因为您在 32 位调试器下启动它(出于原因)stackoverflow.com/a/397695/3147740
-
解决方案平台名称在 C# 项目中无关紧要,仅对 C++ 项目重要。使用不同构建工具的项目类型很重要。唯一重要的设置是您的 EXE 项目中的设置,即强制使用特定抖动的设置。项目 > 属性 > 构建选项卡 > 首选 32 位和平台目标。他们试图在 VS2010 中改变这一点,给 C# 项目一个解决方案平台名称“x86”。大失败鲸,回到 VS2012 中的 AnyCPU。
-
@HansPassant 你是对的。我只是取消选中“首选 32 位”并且它有效。你能告诉我为什么这是一个很大的失败吗?万分感谢 !现在我可以理解这里发生了什么。
-
@PTwr 我什至在发布时尝试过,它需要取消选中“首选 32 位”选项,或者像 Hans Passant 所说的那样直接在“平台目标”中指定 x64 模式。谢谢!