首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Delphi/C++ Builder 取得作業系統版本資訊:GetVersionEx 完整範例

     編輯:關於C++

核心 API:GetVersionEx

GetVersionEx 填入 TOSVersionInfo (對應 OSVERSIONINFO) 結構,回傳作業系統平台識別碼、主/次版本號、建置編號等。注意:Windows 8.1 / 10 / 11 因應用程式相容性機制,若未在 Manifest 宣告 supportedOS,會回傳舊版版本號 (如 6.2)。現代開發建議改用 Version Helper API (IsWindows10OrGreater 等) 或 WMI/PDH。

結構定義 (Delphi / C++ Builder VCL)

// Delphi
type
  TOSVersionInfo = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of Char; // Service Pack 字串
  end;

// C++ Builder (VCL 封裝)
struct TOSVersionInfo {
  DWORD dwOSVersionInfoSize;
  DWORD dwMajorVersion;
  DWORD dwMinorVersion;
  DWORD dwBuildNumber;
  DWORD dwPlatformId;
  char szCSDVersion[128];
};

平台識別碼對照表

常數值對應平台
VER_PLATFORM_WIN32s0Win32s on Windows 3.1
VER_PLATFORM_WIN32_WINDOWS1Windows 95 / 98 / Me
VER_PLATFORM_WIN32_NT2Windows NT 4.0 / 2000 / XP / 2003 / Vista / 7 / 8 / 10 / 11

完整範例程式碼

Delphi 版

procedure GetOSInfo(var OSName: string; var Major, Minor, Build: Integer);
var
  VerInfo: TOSVersionInfo;
begin
  VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
  if GetVersionEx(VerInfo) then
  begin
    case VerInfo.dwPlatformId of
      VER_PLATFORM_WIN32s:        OSName := 'Win32s';
      VER_PLATFORM_WIN32_WINDOWS: OSName := 'Windows 95/98/Me';
      VER_PLATFORM_WIN32_NT:      OSName := 'Windows NT';
    else
      OSName := 'Unknown';
    end;
    Major := VerInfo.dwMajorVersion;
    Minor := VerInfo.dwMinorVersion;
    Build := VerInfo.dwBuildNumber;
  end
  else
    RaiseLastOSError;
end;

// 使用範例
var
  Name: string; Maj, Min, Bld: Integer;
begin
  GetOSInfo(Name, Maj, Min, Bld);
  ShowMessage(Format('%s %d.%d (Build %d)', [Name, Maj, Min, Bld]));
end;

C++ Builder 版


AnsiString GetOSVersionString() {
  TOSVersionInfo VerInfo;
  VerInfo.dwOSVersionInfoSize = sizeof(VerInfo);
  if (!GetVersionEx(&VerInfo)) return "Failed to get version";

  AnsiString OSName;
  switch (VerInfo.dwPlatformId) {
    case VER_PLATFORM_WIN32s:        OSName = "Win32s"; break;
    case VER_PLATFORM_WIN32_WINDOWS: OSName = "Windows 95/98/Me"; break;
    case VER_PLATFORM_WIN32_NT:      OSName = "Windows NT"; break;
    default:                         OSName = "Unknown"; break;
  }

  return OSName + " " + IntToStr(VerInfo.dwMajorVersion) + "." +
         IntToStr(VerInfo.dwMinorVersion) + " Build " + IntToStr(VerInfo.dwBuildNumber) +
         " (" + VerInfo.szCSDVersion + ")";
}

// 使用
ShowMessage(GetOSVersionString());

常見版本號對照表 (NT 系列)

作業系統Major.MinorBuild 範例
Windows NT 4.04.01381
Windows 20005.02195
Windows XP5.12600
Windows Server 20035.23790
Windows Vista / Server 20086.06000
Windows 7 / Server 2008 R26.17600
Windows 8 / Server 20126.29200
Windows 8.1 / Server 2012 R26.39600
Windows 10 / Server 2016+10.010240, 19041, 22000...

進階:偵測具體產品版本 (產品類型、套裝軟體)

若需區分「專業版/家用版/伺服器版」或偵測特定功能可用性,建議:

  • Version Helpers (SDK 8.1+): #include ,使用 IsWindows10OrGreater(), IsWindowsServer() 等內聯函式,自動處理 Manifest 問題。
  • GetProductInfo (Vista+): 取得 PRODUCT_* 產品類型常數。
  • WMI Win32_OperatingSystem: 查詢 Caption, OperatingSystemSKU 等屬性,資訊最豐富但需 COM 初始化。

注意事項總結

  1. 呼叫前**必須**設定 dwOSVersionInfoSize = sizeof(TOSVersionInfo),否則函式失敗。
  2. Windows 8.1+ 需在應用程式 Manifest 加入 <supportedOS Id="{...}"> 才能取得真實版本號,否則永遠回傳 6.2 (Windows 8)。
  3. GetVersionEx 在新版 SDK 標記為 Deprecated,新專案優先採用 Version Helpers 或 GetSystemTimes/PDH 等特定功能 API。
  4. 64 位元應用程式在 32 位元相容層 (WoW64) 下呼叫仍正常運作,回傳宿主 OS 版本。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved