星期四, 九月 24, 2009

Windows SDK練習曲--Windows版本相關資訊 [Native Code] (2)

取得Windows版本相關資訊--Native Code(1)》曾提及取自Windows SDK 7的Getting the System Version主控台程式,這個程式用了許多Windows API取得Windows版本資訊,以下則將簡述這些API。

GetVersionEx

從Windows 2000就存在的GetVersionEx,是取得Windows版本資訊的基本函式。如果呼叫失敗,GetVersionEx會傳回0;呼叫成功則傳回非0。

GetVersionEx必須使用OSVERSIONINFO或OSVERSIONINFOEX結構作為參數,GetVersionEx會將取得的資訊置入作為參數的結構,包括Windows的主序號、次序號等。以下列出幾個Windows的主序號及次序號。

Windows 主序號.次序號
Windows 2000 5.0(用戶端及伺服端皆然)
Windows XP 5.1
Windows Server 2003 5.2
Windows Server 2003 R2 5.2
Windows Vista 6.0
Windows Server 2008 6.0
Windows 7 6.1
Windows Server 2008 R2 6.1


這支程式會用到OSVERSIONINFOEX的以下成員:

  • dwPlatformId:平台代號,其值若為VER_PLATFORM_WIN32_NT,表示NT平台。
  • dwMajorVersion:主版本序號
  • dwMinorVersion:次版本序號
  • wProductType:Windows作業系統的產品類型,有VER_NT_WORKSTATION、VER_NT_SERVER、VER_NT_DOMAIN_CONTROLLER等3種常數值。用來判斷Windows是用戶端還是伺服器版本。
  • wSuiteMask:Windows作業系統的組合方式,可以利用位元運算(遮罩)查得作業系統的詳細資訊。可以用來檢查伺服器版是不是Home Server、Datacenter或Enterprise等版本、用戶端版是不是家用版、或是不是Embedded版本。

關於GetVersionEx及OSVERSIONINFOEX,還可參考舊作《如何檢測各種Windows平台的版本資訊》的《利用GetVersionEx檢查Windows系統版本》、《GetVersionEx使用範例》、《OSVERSIONINFOEX結構剖析》、《GetVersionEx與OSVERSIONINFOEX搭配應用》等節。

GetNativeSystemInfo / GetSystemInfo

這兩個函式在這支程式的目的是偵測Windows版本是不是x86、x64或IA64。32位元程式要呼叫GetNativeSystemInfo,64位元程式要呼叫GetSystemInfo。GetNativeSystemInfo或GetSystemInfo需使用SYSTEM_INFO結構,而這支程式會用到結構中的wProcessorArchitecture成員,這個成員可以是以下常數值:

常數值 說明
PROCESSOR_ARCHITECTURE_AMD64 x64
PROCESSOR_ARCHITECTURE_IA64 IA64(Intel Itanium)
PROCESSOR_ARCHITECTURE_INTEL x86
PROCESSOR_ARCHITECTURE_UNKNOWN 未知

GetSystemMetrics

這個API會根據參數而傳回系統特定的公制單位或系統設定值。這支程式以下列方式檢查是不是Windows Server 2003 R2:

if( GetSystemMetrics(SM_SERVERR2) )

GetProductInfo

這是Vista及Windows Server 2008開始支援的API,可以根據傳入的主、次版本序號及主、次Service Pack版本序號,取得SKU(例如旗艦版還是企業版)。此函式實際上可取得的 SKU 不止這支程式所列,完整資訊可參考SDK文件。

參考資料:MSDN Getting the System Version

0 意見: