我想:如何確定System.Diagnostics.Process是32位還是64位?
process.MainModule.FileName.Contains("x86")
但它拋出一個異常的64位處理:
Win32Exception:只有進行ReadProcess OU WriteProcessMemory的請求的一部分完成
我想:如何確定System.Diagnostics.Process是32位還是64位?
process.MainModule.FileName.Contains("x86")
但它拋出一個異常的64位處理:
Win32Exception:只有進行ReadProcess OU WriteProcessMemory的請求的一部分完成
,你需要通過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;
}
中此方法在32位Windows中失敗 – 2010-08-26 16:44:32
在32位Windows上,所有進程都是32位,因此不需要執行檢查。我編輯了Is64BitProcess來反映這一點。 – 2010-08-27 07:37:19
使用Process.SafeHandle屬性可防止GC清除進程。在WinAPI被調用時處理。 – 2016-08-01 09:38:40
無論WMI的Win32_Process
或System.Diagnostics.Process
提供任何明確的財產。
如何通過加載的模塊(Process.Modules
)迭代,32位進程將裝入%WinDir%\syswow64\kernel32.dll
而一個64位的過程中會從%WinDir%\system32\kernel32.dll
裝好了(這是一個DLL,它每 Windows進程加載)。
注意:當然,這個測試在x86操作系統實例上會失敗。
Environment.Is64BitProcess
可能是你在找什麼。
這隻告訴你,如果調用進程是64位的,我想OP想知道另一個進程是64位的 – 2010-08-26 15:43:54
@Phil:是的,我不確定OP的意圖是什麼。我認爲他可以倒下或評論。 – 2010-08-26 15:53:27
您指出的此方法不包含在.NET Fx – 2010-08-26 16:25:41
你是問錯了問題。真正的問題應該是:「我怎麼搞砸了ReadProcessMemory調用?」 – 2010-08-26 15:20:14
@Hans只要問題標題得到回答,我根本不在乎這個問題。我列出的問題只是回答標題的方法。 – 2010-08-26 16:00:15
[如何以編程方式知道進程是32位還是64位](http://stackoverflow.com/questions/1953377/how-to-know-a-process-is-32-bit-or -64位編程) – 2010-08-26 16:15:17