C# Programming

ImageWindows のバージョン判定

開発環境: Visual Studio 2003 

1.目次

  1. 目次
  2. 目的
  3. 参考書
  4. Windows のバージョン判定、侮るべからず
  5. 「おやま」さまのバージョン判定コード
  6. 簡易バージョン判定コード

2.目的

Windows のバージョンを判断する方法です。
意外と、面倒なので、OSバージョンに依存するコードの場合には、注意が必要です。
一見簡単そうなんですが、まじめに細かいところまで判定しようと思うと、奥が深いです。
この点に関して、C#プログラミング BBS No.242 のおやま様より詳しく教えていただきましたので、ご紹介します。

3.参考書

  1. C#プログラミング BBS No.242
  2. マイクロソフト サポート技術情報 - 304283 [HOW TO] Visual C# .NET を使用して Windows のバージョンを判断する方法
  3. マイクロソフト サポート技術情報 - 304721 Visual C# .NET でオペレーティング システムの Service Pack レベルを判断する方法
  4. MSDN OSVERSIONINFOEX
  5. Microsoft Windows Hardware and Driver Central (WHDC)

4.Windows のバージョン判定、侮るべからず

注意
C#プログラミング BBS No.242 のおやま様より、参考書(3)のMSDNのやり方では正常に判定できない。なぜかRevisionは必ず0を返すという報告がありました。

以下、おやま様の情報をもとにしています。

参考文献(4)、(5)では、OSVERSIONINFOEXやOSVERSIONINFOの詳しい説明が書かれています。
OSVERSIONINFOEXについてはWinNT4 SP6以降で使用可能です
使用不可なOSでは値として0を返してきます。
またSuiteMaskやProductTypeの使い方などが書かれています。


System.PlatformID の Enum は次のとおりです。
Enum の値
System.PlatformID.Win32S 0
System.PlatformID.Win32Windows 1
System.PlatformID.Win32NT 2
System.PlatformID.WinCE 3

Win 98 Win98 SE Windows Me Windows NT 4.0 Windows
2000 Pro
Windows 2000
Server
Windows XP
Home
Windows XP
Pro
Windows
2003 Server
Windows CE Vista
PlatformIDWin32
Windows
Win32
Windows
Win32
Windows
Win32NTWin32NTWin32NTWin32NTWin32NTWin32NTWinCE不明
メジャー
バージョン
444455555不明たぶん
マイナ
バージョン
101090000112不明不明
ビルド677662226776644673010104138121952195260026003790 ??
リビジョン000000000 ??

5.「おやま」さまのバージョン判定コード

変更履歴
2003/12/1   C# プログラミング BBS No.242の「おやま」さまのバージョン判定コードです。

「おやま」さまのバージョン判定コード
// Copyright All rights reserved by おやま
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace x
{

    class Class1
    {
        [StructLayout(LayoutKind.Sequential)]
            public struct OSVERSIONINFOEX
        {
            public int dwOSVersionInfoSize;
            public int dwMajorVersion;
            public int dwMinorVersion;
            public int dwBuildNumber;
            public int dwPlatformId;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string szCSDVersion;
            public short wServicePackMajor;
            public short wServicePackMinor;
            public short wSuiteMask;
            public sbyte wProductType;
            public sbyte wReserved;

        }
        public struct OSVERSIONINFO
        {
            public int dwOSVersionInfoSize;
            public int dwMajorVersion;
            public int dwMinorVersion;
            public int dwBuildNumber;
            public int dwPlatformId;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] public string szCSDVersion;
        }
        [DllImport("kernel32.Dll")] public static extern short GetVersionExA(ref OSVERSIONINFO o);
        [DllImport("kernel32.Dll")] public static extern short GetVersionEx(ref OSVERSIONINFOEX o);
        static void Main(string[] args)
        {
            OSVERSIONINFOEX os = new Class1.OSVERSIONINFOEX();
            os.dwOSVersionInfoSize=Marshal.SizeOf(typeof(OSVERSIONINFOEX)); 
            GetVersionEx(ref os);
            if(os.dwBuildNumber == 0 )
            {
                OSVERSIONINFO os2 = new Class1.OSVERSIONINFO();
                os2.dwOSVersionInfoSize=Marshal.SizeOf(typeof(OSVERSIONINFO)); 
                GetVersionExA(ref os2);
                Console.WriteLine(os2.dwMajorVersion);
                Console.WriteLine(os2.dwMinorVersion);
                Console.WriteLine(os2.dwBuildNumber & 0xFFFF);
                Console.WriteLine(os2.dwPlatformId);
                Console.WriteLine(os2.szCSDVersion);
            }
            else
            {
                Console.WriteLine(os.dwMajorVersion);
                Console.WriteLine(os.dwMinorVersion);
                Console.WriteLine(os.dwBuildNumber);
                Console.WriteLine(os.dwPlatformId);
                Console.WriteLine(os.szCSDVersion);
                Console.WriteLine(os.wServicePackMajor);
                Console.WriteLine(os.wServicePackMinor);
                Console.WriteLine(os.wSuiteMask);
                Console.WriteLine(os.wProductType);
                Console.WriteLine(os.wReserved);
            }
            Console.ReadLine();
        }

    }
}

6.簡易バージョン判定コード

変更履歴
2003/10/25   初版作成
2003/11/23   98SE 判定を追加。
2003/12/1   BBSで「おやま」さまの情報より、簡易版(98、98 SEの判定ができない)に修正。

注意
XP Home 以外未検証です。

簡易判定バージョン.cs
using System;

namespace WinVersion
{
    /// <summary>
    /// Class1 の概要の説明です。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAtdread]
        static void Main(string[] args)
        {
            System.PlatformID platID = System.Environment.OSVersion.Platform;
            int major = System.Environment.OSVersion.Version.Major;
            int minor = System.Environment.OSVersion.Version.Minor;
            switch(platID)
            {
                case System.PlatformID.Win32Windows:
                    if (major == 4 && minor == 0)
                        Console.WriteLine("Windows 95");
                    else if (major == 4 && minor == 10)
                        Console.WriteLine("Windows 98か 98 SE");
                    else if (major == 4 && minor == 90)
                        Console.WriteLine("Windows Me");
                    else
                        tdrow new Exception("Invalid OS version");
                    break;
                case System.PlatformID.Win32NT:
                    if (major == 4 && minor == 0)
                        Console.WriteLine("Windows NT 4.0");
                    else if (major == 5 && minor == 0)
                        Console.WriteLine("Windows 2000 Serverか 200 Pro");
                    else if (major == 5 && minor == 1)
                        Console.WriteLine("Windows XP Proか XP Home");
                    else if (major == 5 && minor == 2)
                        Console.WriteLine("Windows 2003 Server");
                    else
                        tdrow new Exception("Invalid OS version");
                    break;
                case System.PlatformID.WinCE:                    
                    Console.WriteLine("Windows CE");
                    break;
                default:
                    tdrow new Exception("Invalid OS version");
            }
            Console.ReadLine();
        }
    }
}