2010-08-26 170 views
5

我想:如何確定System.Diagnostics.Process是32位還是64位?

process.MainModule.FileName.Contains("x86") 

但它拋出一個異常的64位處理:

Win32Exception:只有進行ReadProcess OU WriteProcessMemory的請求的一部分完成

+1

你是問錯了問題。真正的問題應該是:「我怎麼搞砸了ReadProcessMemory調用?」 – 2010-08-26 15:20:14

+1

@Hans只要問題標題得到回答,我根本不在乎這個問題。我列出的問題只是回答標題的方法。 – 2010-08-26 16:00:15

+0

[如何以編程方式知道進程是32位還是64位](http://stackoverflow.com/questions/1953377/how-to-know-a-process-is-32-bit-or -64位編程) – 2010-08-26 16:15:17

回答

8

,你需要通過P/Invoke來調用IsWow64Process

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool IsWow64Process([In] IntPtr processHandle, [Out, MarshalAs(UnmanagedType.Bool)] out bool wow64Process); 

這裏有一個助手,使之更容易一點致電:

public static bool Is64BitProcess(this Process process) 
{ 
    if (!Environment.Is64BitOperatingSystem) 
     return false; 

    bool isWow64Process; 
    if (!IsWow64Process(process.Handle, out isWow64Process)) 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 

    return !isWow64Process; 
} 
+1

中此方法在32位Windows中失敗 – 2010-08-26 16:44:32

+1

在32位Windows上,所有進程都是32位,因此不需要執行檢查。我編輯了Is64BitProcess來反映這一點。 – 2010-08-27 07:37:19

+0

使用Process.SafeHandle屬性可防止GC清除進程。在WinAPI被調用時處理。 – 2016-08-01 09:38:40

1

無論WMI的Win32_ProcessSystem.Diagnostics.Process提供任何明確的財產。

如何通過加載的模塊(Process.Modules)迭代,32位進程將裝入%WinDir%\syswow64\kernel32.dll而一個64位的過程中會從%WinDir%\system32\kernel32.dll裝好了(這是一個DLL,它 Windows進程加載)。

注意:當然,這個測試在x86操作系統實例上會失敗。

0

Environment.Is64BitProcess可能是你在找什麼。

+2

這隻告訴你,如果調用進程是64位的,我想OP想知道另一個進程是64位的 – 2010-08-26 15:43:54

+0

@Phil:是的,我不確定OP的意圖是什麼。我認爲他可以倒下或評論。 – 2010-08-26 15:53:27

+0

您指出的此方法不包含在.NET Fx – 2010-08-26 16:25:41

相關問題