1. 程式人生 > >C#判斷作業系統是32位還是64位的方法

C#判斷作業系統是32位還是64位的方法

publicstaticstring Distinguish64or32System()
{
try
{
string addressWidth = String.Empty;
ConnectionOptions mConnOption
=new ConnectionOptions();
ManagementScope mMs
=new ManagementScope("////localhost", mConnOption);
ObjectQuery mQuery
=new ObjectQuery(
"select AddressWidth from Win32_Processor");
ManagementObjectSearcher mSearcher
=new ManagementObjectSearcher(mMs, mQuery);
ManagementObjectCollection mObjectCollection
= mSearcher.Get();
foreach (ManagementObject mObject in mObjectCollection)
{
addressWidth
= mObject["AddressWidth"].ToString();
}
return addressWidth;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return String.Empty;
}
}

最近因為要根據系統的情況來決定安裝那種驅動,所以需要判斷下系統是32bit,還是64bit

方法一:主要是利用getSystemWow64Directory這個函式來判斷!

typedef UINT (WINAPI* GETSYSTEMWOW64DIRECTORY)(LPTSTR, UINT);
BOOL IsWow64(void)
{
#ifdef _WIN64
return FALSE;
#else
GETSYSTEMWOW64DIRECTORY getSystemWow64Directory;
HMODULE hKernel32;
TCHAR Wow64Directory[MAX_PATH];
hKernel32 = GetModuleHandle(TEXT("kernel32.dll"));
if (hKernel32 == NULL) {
//
// This shouldn't happen, but if we can't get
// kernel32's module handle then assume we are
//on x86. We won't ever install 32-bit drivers
// on 64-bit machines, we just want to catch it
// up front to give users a better error message.
//
return FALSE;
}
getSystemWow64Directory = (GETSYSTEMWOW64DIRECTORY)
GetProcAddress(hKernel32, "GetSystemWow64DirectoryW");
if (getSystemWow64Directory == NULL) {
//
// This most likely means we are running
// on Windows 2000, which didn't have this API
// and didn't have a 64-bit counterpart.
//
return FALSE;
}
if ((getSystemWow64Directory(Wow64Directory,
sizeof(Wow64Directory)/sizeof(TCHAR)) == 0) &&
(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) {
return FALSE;
}
//
// GetSystemWow64Directory succeeded
// so we are on a 64-bit OS.
//
return TRUE;
#endif
}

方法二:主要是利用IsWow64Process

#include <windows.h> typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle("kernel32"),"IsWow64Process"); BOOL IsWow64() { BOOL bIsWow64 = FALSE; if (NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { // handle error } } return bIsWow64; } //判斷當前程序
C# codeif (IntPtr.Size == 8)
{
// 64bit
}
else if (IntPtr.Size == 4)
{
// 32bit
}
正確的方法應該是這樣:
BOOL IsWow64()
{
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
    LPFN_ISWOW64PROCESS fnIsWow64Process;
    BOOL bIsWow64 = FALSE;
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle("kernel32"),"IsWow64Process");
    if (NULL != fnIsWow64Process)
    {
        fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
    }
    return bIsWow64;
}
不是判斷函式地址是否有效,而是判斷輸出型引數bIsWow64的值.