次のテストコードを書いたところ、Win2008R2ではメジャーが6、マイナーが1となり、Win2012R2ではメジャーが6,マイナーが2となりました。
この識別方法で合っているのか、お知恵をお貸し下さい。
procedure TForm1.FormCreate(Sender: TObject);
var
udtInfo: OSVERSIONINFO;
begin
udtInfo.dwOSVersionInfoSize := Sizeof(OSVERSIONINFO);
if GetVersionEx(udtInfo) then begin
with udtinfo do begin
case dwPlatformId of
VER_PLATFORM_WIN32_NT:
begin
Memo1.lines.Add(IntToStr(dwMajorVersion));
Memo1.lines.Add(IntToStr(dwMinorVersion));
Memo1.lines.Add(IntToStr(dwPlatformId));
Memo1.lines.Add(string(szCSDVersion));
end;
end;
end;
end;
end;
>この識別方法で合っているのか、お知恵をお貸し下さい。
こんなとこが参考になりませんか ?
[OSVERSIONINFO structure (Windows)]
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724834%28v=vs.85%29.aspx
Windows Server 2012 R2 については以下に記事がありますね.
要約すると,アプリケーションマニュフェストの SupportedOS で明示的に 8.1 の宣言が必要なようです.
[Windows 8.1(または、Windows Server 2012 R2)で正しいバージョンを取得する]
http://dobon.net/vb/dotnet/system/osversion.html#windows8point1
マニフェストについてはこちらもどうぞ。
アプリケーションマニフェスト [Delphi Programming]
http://ht-deko.com/tech077.html
あとWMIを使うという手もあります(root\CIMV2のWin32_OperatingSystem)。
Mr.XRAYさん、通りすがりさん、レスありがとうございました。
色々と試行錯誤をしましたが、当初のソースでお手軽に済ませることにしました。
アドバイスありがとうございました。
解決済みですが、Mr.XRAYさん、通りすがりさんの発言通り、GetVersionEX APIは
マニフェストを設定しないと正しい値を返さないようになっているようです。
そこで、ドライバの開発などに用いるRtlGetVersion APIを使用する方法もあります。
RtlGetVersion routine
https://msdn.microsoft.com/en-us/library/windows/hardware/ff561910(v=vs.85).aspx
GetVersionEXとRtlGetVersionの結果の違い
Windows 10 TPのバージョン判定
http://8thway.blogspot.jp/2014/10/windows-10-tp-version.html
ツイート | ![]() |