簡易判斷目前作業系統/處理程序是否為64bit模式
在開發程式時,有時會因為 32 位元或 64 位元的關係需要做到不同的動作,因此需要判斷目前所在的模式。
調用 kernel32 來進行相關的判斷
[System.Runtime.InteropServices.DllImport("kernel32")]
private extern static bool IsWow64Process(IntPtr hProcess, out bool isWow64);
[System.Runtime.InteropServices.DllImport("kernel32")]
private extern static IntPtr GetCurrentProcess();
[System.Runtime.InteropServices.DllImport("kernel32")]
private extern static IntPtr GetModuleHandle(string moduleName);
[System.Runtime.InteropServices.DllImport("kernel32")]
private extern static IntPtr GetProcAddress(IntPtr hModule, string methodName);
1. 判斷目前處理程序是否為 64 位元
public bool Is64BitProcess
{
get
{
return IntPtr.Size == 8;
}
}
透過系統的 Intptr 型別來進行簡易的判斷。
4 = 32 位元
8 = 64 位元
2. 判斷作業系統是否為 64 位元
public bool Is64BitOperatingSystem
{
get
{
if (Is64BitProcess) return true;
bool isWow64;
return ModuleContainsFunction("kernel32.dll", "IsWow64Process") && IsWow64Process(GetCurrentProcess(), out isWow64) && isWow64;
}
}
當目前處理程序為 64 位元,則可以判定作業系統一定是 64 位元
當目前kernel32有提供IsWow64Process函數與目前處理程序處於Wow64的狀態下,則判定作業系統為 64 位元。
private bool ModuleContainsFunction(string moduleName, string methodName)
{
IntPtr hModule = GetModuleHandle(moduleName);
if (hModule != IntPtr.Zero)
return GetProcAddress(hModule, methodName) != IntPtr.Zero;
return false;
}
所以透過 Is64BitProcess 就可以知道目前處理程序是否為 64 位元,另外 Is64BitOperatingSystem 可以知道目前的作業系統是否為 64 位元。
程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的魯莽行動。