GetVersionEx 填入 TOSVersionInfo (對應 OSVERSIONINFO) 結構,回傳作業系統平台識別碼、主/次版本號、建置編號等。注意:Windows 8.1 / 10 / 11 因應用程式相容性機制,若未在 Manifest 宣告 supportedOS,會回傳舊版版本號 (如 6.2)。現代開發建議改用 Version Helper API (IsWindows10OrGreater 等) 或 WMI/PDH。
// 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_WIN32s | 0 | Win32s on Windows 3.1 |
| VER_PLATFORM_WIN32_WINDOWS | 1 | Windows 95 / 98 / Me |
| VER_PLATFORM_WIN32_NT | 2 | Windows NT 4.0 / 2000 / XP / 2003 / Vista / 7 / 8 / 10 / 11 |
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;
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());
| 作業系統 | Major.Minor | Build 範例 |
|---|---|---|
| Windows NT 4.0 | 4.0 | 1381 |
| Windows 2000 | 5.0 | 2195 |
| Windows XP | 5.1 | 2600 |
| Windows Server 2003 | 5.2 | 3790 |
| Windows Vista / Server 2008 | 6.0 | 6000 |
| Windows 7 / Server 2008 R2 | 6.1 | 7600 |
| Windows 8 / Server 2012 | 6.2 | 9200 |
| Windows 8.1 / Server 2012 R2 | 6.3 | 9600 |
| Windows 10 / Server 2016+ | 10.0 | 10240, 19041, 22000... |
若需區分「專業版/家用版/伺服器版」或偵測特定功能可用性,建議:
#include ,使用 IsWindows10OrGreater(), IsWindowsServer() 等內聯函式,自動處理 Manifest 問題。PRODUCT_* 產品類型常數。Caption, OperatingSystemSKU 等屬性,資訊最豐富但需 COM 初始化。dwOSVersionInfoSize = sizeof(TOSVersionInfo),否則函式失敗。<supportedOS Id="{...}"> 才能取得真實版本號,否則永遠回傳 6.2 (Windows 8)。GetVersionEx 在新版 SDK 標記為 Deprecated,新專案優先採用 Version Helpers 或 GetSystemTimes/PDH 等特定功能 API。