Win32 API を使わずに Windows バージョン判定
2004年11月6日 Win32Visual 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;
}
--
(注意)
ソースをコピー&ペーストしてビルド(コンパイルリンク)する場合は、下記の作業を行う必要があります。
全角’<’文字を、全て半角文字に変更する。
全角’>’文字を、全て半角文字に変更する。
全角’,’文字を、全て半角文字に変更する。
全角’%’文字を、全て半角文字に変更する。
全角’|’文字を、全て半角文字に変更する。
全角スペース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;
}
--
コメント