【问题标题】:How can I tell if another process is 64bit?如何判断另一个进程是否为 64 位?
【发布时间】:2016-08-13 12:47:39
【问题描述】:

我有一个正在运行的应用程序的 Process

如何判断(最好不使用 p/invoking)该进程是否为 64 位?

【问题讨论】:

  • 我想这已经被问过了:stackoverflow.com/questions/3324771/…
  • @BrandonZeider:寻找非 p/invoke。此外,这个问题来自 4 之前的问题,对于框架的每个新版本,希望都会源源不断地涌现。

标签: c# process 64-bit


【解决方案1】:

我认为没有 PInvoke 就没有 100% 确定的方法。

但一个可行的方法是检查一组加载的模块 (Process.Modules)。如果主要模块(user32、kernel32 等)来自 Wow64 目录并且您正在运行一台 64 位机器,那么它很有可能是一个 32 位进程。如果它们不是来自 Wow64 目录并且它是 64 位机器,那么它很可能是 64 位进程。

同样不是确定的,而是一个很好的估计。

【讨论】:

  • 我知道,当我尝试访问模块时,如果进程是 64 位(而我的是 32 位),它会抛出 Win32Exception,但我希望有一个不是异常的算法- 基于。
  • @Will,没有意识到它会在跨 32 / 64 位进程边界访问时抛出。
  • 是的。我当时想“嗯,这很有趣。现在呢?”
【解决方案2】:

您需要使用PInvoke IsWow64Process

【讨论】:

  • 当从 64 位进程调用它时,这对于 64 位进程返回 false,对于 32 位进程返回 true。如何无一例外地从 32 位进程(在 64 位操作系统上)检测 64 位进程?
【解决方案3】:

正如其他人所说,您可以使用IsWow64Process,它很容易实现here

【讨论】:

    【解决方案4】:

    很容易,如果一个进程在 64 位操作系统上运行,那么它就是一个 64 位进程。

    最初为 32 位系统编写的代码可以在 64 位版本上运行,因为它可以在 64 位环境的内存限制内运行。但是,无论它是否旨在利用这一事实,它都不再受这些限制的约束。因此,如果它在 64 位机器上运行,则不存在“32 位进程”之类的东西。

    把它想象成一只狗,它被训练使用隐形栅栏留在特定区域内。如果围栏区域稍后扩大,您会发现一些更聪明的狗会立即开始使用新区域。即使其他狗可能没有意识到这种变化并继续在它们感知的范围内运作,但这并不意味着它们的局限性与更聪明的狗不同。

    【讨论】:

    • 我不同意您在此处提供的内容。从技术上讲,也许你是正确的,我不知道。但是,程序被明确定义为 32 位进程或 64 位进程,并且在尝试在它们之间进行通信时具有不同的规则集。从开发人员的角度来看,它们的处理方式不同。
    • 这个答案不正确,因为 32 位进程和 64 位进程之间存在真正的差异和限制,即使它们都在 64 位 Windows 上运行。请参阅 WOW64 上的文档。 msdn.microsoft.com/en-us/library/windows/desktop/…
    • 此外,该进程将根据情况加载 32 位或 64 位 DLL。
    • 32 位进程运行 32 位代码,由 32 位 PE 映像支持。在 64 位操作系统上,它在模拟器中运行。在 64 位版本的 Windows 中这样的东西,例如 32 位进程。这不仅仅是地址空间的任意限制。这只是人们不难理解的极限。还有很多要理解的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2012-07-31
    • 1970-01-01
    • 2012-01-29
    • 2019-03-20
    相关资源
    最近更新 更多