ちぇりーの館

1−3 C言語プログラミング小ネタ講座 
WindowsのOS判定



今回の小ネタは、windowsのOS判定方法です。例えばWindowsXP専用の、市販ソフトを買ってきて windows95で起動させようとした場合、うまく動かない場合があります。このような場合を想定して、普通は ユーザーさんがプログラムを動かした時に、OSを調べて、対象外の場合には、『このOSは対象外だからうごかないよー! |(-_-)|』 という、メッセージを表示させ、極力ユーザーさんから電話攻撃を受けないようにします。

・WindowsのOS判定プログラム

#include "windows.h"

〜〜〜〜〜〜〜〜

OSVERSIONINFOA osVerInfo;

/* OSの取得 */	
osVerInfo.dwOSVersionInfoSize = sizeof(osVerInfo);
GetVersionExA(&osVerInfo);

/* OS情報の取得 */
switch(osVerInfo.dwPlatformId)
{
   case VER_PLATFORM_WIN32_NT:			//Windows NT系(NT/2000/XP/vista/7)
      if(osVerInfo.dwMajorVersion <= 4)
      {
         MessageBox( hWnd, "Windows NTは、サポート外です。", "OS判定チェック", MB_OK );
      }
      else{ //2000/XP/vista/7
         //ここからは、サポート内
         if(osVerInfo.dwMajorVersion == 5)
         {//2000 or XP
            switch(osVerInfo.dwMinorVersion)
            {
               case 0: MessageBox( NULL, "Windows 2000です。",         "OS判定チェック", MB_OK ); break; //windows 2000
               case 1: MessageBox( NULL, "Windows XPです。",           "OS判定チェック", MB_OK ); break; //windows XP
               case 2: MessageBox( NULL, "Windows 2003 Serverです。",  "OS判定チェック", MB_OK ); break; //windows XP
            }
         }
         else if(osVerInfo.dwMajorVersion == 6)
         {
            switch(osVerInfo.dwMinorVersion)
            {
               case 0: MessageBox( NULL, "Windows Vistaです。",     "OS判定チェック", MB_OK ); break; //windows XP
               case 1: MessageBox( NULL, "Windows 7です。",         "OS判定チェック", MB_OK ); break; //windows 7
               default:MessageBox( NULL, "Windows 7以降のOSです。", "OS判定チェック", MB_OK ); break; //windows 7以降のOS
            }
         }
         else{
         	MessageBox( NULL, "Windows 7以降のOSです。",        "OS判定チェック", MB_OK ); //windows 7以降のOS
         }
      }
      break;

   case VER_PLATFORM_WIN32_WINDOWS: //Windows 9X系
   default:                         //(windows3.1や、Windows CEの場合ここに来ます。)
      MessageBox( NULL, "サポート外のOSです。", "OS判定チェック", MB_OK ); //Windows 9X系、windows3.1、Windows CE
      break;
}

 一見、複雑そうに見えますが、やってる事は非常にシンプルです。GetVersionExA関数に、OSVERSIONINFOA構造体を渡します。 たった、これだけでOS情報が取れてしまうので、後はOSVERSIONINFOA構造体のdwPlatformIdでNT系か、9x系かを調べて、"dwMajorVersion""dwMinorVersion"に保持された 数字から現在のOSを特定するだけです。


・dwPlatformId

 Windowsは大きく分けてwindows9x系windowsNT系と呼ばれる2つに分けられます。windows9x系は、いわゆるwindows95, 98, me で、windowsNT系は、windowsNT, 2000, XP, Vista, windows7に当たります。昔は、サーバー用にwindosNT系を、個人用にwindows9x系用 としていましたが、現在はwindosNT系用のみになっています。プログラムでは、まず9x系かNT系か判別するために、dwPlatformIdに保持されている値を調べます。 dwPlatformIdが、VER_PLATFORM_WIN32_WINDOWSの場合には、9x系となり、VER_PLATFORM_WIN32_NTの場合には、NT系となります。ちなみに、ゲームソフトなどでは、 windows98より前のOSはサポート外としている場合が多いです。

・dwMajorVersionとdwMinorVersion

dwMajorVersionとdwMinorVersionの関係は、以下になります。

< dwMajorVersionとdwMinorVersionの関係 >
dwMajorVersiondwMinorVersionwindows名
4-Windows NT
50Windows 2000
51Windows XP
52Windows 2003 Server
60Windows Vista
61Windows 7


 ここで、dwMajorVersionとdwMinorVersionには重要なある原則があります。それは、『必ず番号が大きいほど上位のOSである』と言う事です。 『なーんだ、当たり前じゃーん』とおもうかもしれませんが、実はこの法則によって非常に助かる事があります。 それは、未知のOSが判別できるからです。つまり、現在最新である、windows7よりも後に出てくるOSは、

 考えられるバージョン@: dwMajorVersionが6より大きい
 考えられるバージョンA: dwMajorVersionが6と等しく且つ、dwMinorVersionが1より大きい

となり、未知のOSを知る事が出来るのです!


不思議な事に、ユーザーさんは、未知のOSで動かない分にはあまり文句を言ってきませんが、
過去のOSで動かない場合には、激しく文句を言って来る傾向にあります。私の経験で、マニュアルに『そんな古いOSじゃ、動かんぜよ〜 (;~_~)』 と書いてあるにも関わらず、怒られた事もありました。そんなトラブルをなくすためにも、Windowsプログラムを組む上では独創的な処理を避けた方が いいですよ (;-v-)/


今回紹介したサンプルプログラムをzipにしてありますので、良かったら参考にしてください。
ダウンロード


< 一覧ページへ戻る


当サイトが面白いと感じた方は、お手数ですが下記リンクをクリックしてください。
クリック毎に当ホームページの評価が上がります。ご協力お願いします!
inserted by FC2 system inserted by FC2 system