Visual C++ の stdlib.h に宣言されている _winmajor 等のグローバル変数を使って、Windows のバージョンをチェックするサンプルプログラムを( ..)φメモメモ

 
(注意)
ソースをコピー&ペーストしてビルド(コンパイルリンク)する場合は、下記の作業を行う必要があります。
全角’<’文字を、全て半角文字に変更する。
全角’>’文字を、全て半角文字に変更する。
全角’,’文字を、全て半角文字に変更する。
全角’%’文字を、全て半角文字に変更する。
全角’|’文字を、全て半角文字に変更する。
全角スペース1文字を、全て半角スペース2文字に変更する。

--
//【Windows のバージョンをチェックする Visual C++ Win32 コンソールプログラム】
// ※このプログラムは Visual C++ 以外ではビルド出来ません。(たぶん(^^;)

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
  DWORD GV = GetVersion();

  //【GetVersion API 値と _winver, _winmajor, _winminor, _osver の関係を表示】
  puts("GetVersion API 値と _winver, _winmajor, _winminor, _osver の関係\n");
  printf("GetVersion API 値 (以下 GV)        = %08X\n\n", GV);
  printf("_winver 値                = %08X\n", _winver);
  printf("((GV << 8) | ((GV >> 8) & 0XFF)) & 0XFFFF = %08X\n\n",
                  ((GV << 8) | ((GV >> 8) & 0XFF)) & 0XFFFF );
  printf("_winmajor 値               = %08X\n", _winmajor);
  printf("GV & 0XFF                 = %08X\n\n", GV & 0XFF );
  printf("_winminor 値               = %08X\n", _winminor);
  printf("(GV >> 8) & 0XFF             = %08X\n\n",
                               (GV >> 8) & 0XFF);
  printf("_osver 値                 = %08X\n", _osver);
  printf("GV >> 16                 = %08X\n\n\n", GV >> 16 );

  //【_winmajor, _winminor, _osver を使用して Windows を判定】
  fputs("このプログラムを実行している Windows は [", stdout);
  if ( _osver < 0X8000 ) {
    //【NT系】 (_osver 下位ワードの最高位ビットが 0 なら NT系)
    switch (_winmajor) {
      case 3:
      case 4:
        printf ("Windows NT %u.%u Build %u",
                         _winmajor, _winminor, _osver);
        break;
      case 5:
        switch (_winminor) {
          case 0:
            printf ("Windows 2000 Build %u", _osver);
            break;
          case 1:
            printf ("Windows XP Build %u", _osver);
            break;
          case 2:
            printf ("Windows Server 2003 family Build %u",
                                    _osver);
            break;
          default:
            printf ("Server 2003 family より新しい NT系Windows"
                         " Build Build %u", _osver);
        }
        break;
      default:
        printf ("Server 2003 family より新しい NT系Windows"
                         " Build Build %u", _osver);
    }
  }
  else {
    switch (_winmajor ) {
      case 0: //【Win32s】
      case 1: // 参照した資料には、 Win32s の時 _winmajor は 3 以下になる
      case 2: // ことしか書かれていない。
      case 3: // よって、0 から 3 までを列挙。
        printf ("Win32s Build %u", _osver & 0X7FFF);
        break;
      case 4: //【9X系】(9X系の場合、_osver にビルド番号が格納されない。)
        switch (_winminor) {
          case 0:
            printf ("Windows 95 Build ----");
            break;
          case 10:
            printf ("Windows 98 Build ----");
            break;
          case 90:
            printf ("Windows Me Build ----");
            break;
          default: // 念の為
            printf ("Me より新しい 9X系Windows Build ----");
        }
        break;
      default: // 念の為
        printf ("Me より新しい 9X系Windows Build ----");
    }
  }
  puts("] です。");

  return 0;
}
--
 

コメント