Win2008R2かWin2012R2かを識別するには?

解決


OSV  2015-10-15 19:14:33  No: 47699

次のテストコードを書いたところ、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;


Mr.XRAY  2015-10-15 19:42:00  No: 47700

>この識別方法で合っているのか、お知恵をお貸し下さい。

こんなとこが参考になりませんか ?

[OSVERSIONINFO structure (Windows)]
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724834%28v=vs.85%29.aspx


Mr.XRAY  2015-10-15 19:58:50  No: 47701

Windows Server 2012 R2 については以下に記事がありますね.
要約すると,アプリケーションマニュフェストの SupportedOS で明示的に 8.1 の宣言が必要なようです.

[Windows 8.1(または、Windows Server 2012 R2)で正しいバージョンを取得する]
http://dobon.net/vb/dotnet/system/osversion.html#windows8point1


通りすがり  2015-10-15 20:44:04  No: 47702

マニフェストについてはこちらもどうぞ。

アプリケーションマニフェスト [Delphi Programming]
http://ht-deko.com/tech077.html

あとWMIを使うという手もあります(root\CIMV2のWin32_OperatingSystem)。


OSV  2015-10-17 20:20:44  No: 47703

Mr.XRAYさん、通りすがりさん、レスありがとうございました。
色々と試行錯誤をしましたが、当初のソースでお手軽に済ませることにしました。
アドバイスありがとうございました。


おかぽん  2015-10-19 17:44:36  No: 47704

解決済みですが、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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加