簡易判斷目前作業系統/處理程序是否為64bit模式

  • 1276
  • 0
  • C#
  • 2014-08-22

簡易判斷目前作業系統/處理程序是否為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 位元。


程式是運氣與直覺堆砌而成的奇蹟。
若不具備這兩者,不可能以這樣的工時實現這樣的規格。
修改規格是對奇蹟吐槽的褻瀆行為。
而追加修改則是相信奇蹟還會重現的魯莽行動。