C#判断操作系统是32位还是64位的方法

    技术2022-05-20  74

    判断系统是否是64位的方法有很多。

    对于C#来说,调用WMI是一种简单易行的方式。我们可以用Win32_Processor类里面的AddressWidth属性来表示系统的位宽。AddressWidth的值受CPU和操作系统的双重影响。

    具体的值如下面的表格所示: 

     32bit OS64bit OS32bit CPUAddressWidth = 32N/A64bit CPUAddressWidth = 32AddressWidth = 64

    可以用下面的C#代码得到AddressWidth的值(注意需添加引用System.Management)

     

    public static string 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# code if (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的值.

    最新回复(0)