山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他Windowsバージョンを取得する(GetVersionEx)
概要
Windows上でバージョン情報を取得する方法はいろいろありますが主な方法として以下の3種類の方法が考えられます。
上表のマニフェストはマニフェストにより動作バージョンを明示することを意味します。
マニフェストを指定しない場合、Windows 8.1まで正常な答えが得られました。マニフェストを指定しない場合ではWindows 10ではWindows 8相当の答えが返ってきます。 上表の互換モードはexeファイルのプロパティで互換性で設定できる互換モードです。
このページではGetVersionEx APIについて解説します。
以下に本プログラムを各Windowsで実行した例を示します。
Windows 98 Second Edition Windows 2000 Service Pack 4 Windows XP Service Pack 3 Windows Vista Service Pack 2 Windows 7 Service Pack 1 Windows 8.1 Windows 10
API | マニフェスト | 互換モード | 備考 |
---|---|---|---|
GetVersionEx API | 8.1以上を取得時には指定が必要 | 依存 | Windows 95以上又はWindows NT 3.5以上で実行可能 Windows 8.1以降は非推奨だが10でも使用可能 |
VerfyVersionInfo API | 10以上を取得時には指定が必要 | 非依存 | 自身のWindowsのバージョンに対して上位か同一か下位といった判定しかできない Windows 2000以上でのみ実行可能 |
RtlGetVersion API | 非依存 | 依存 | DDK等をインストールしていない場合、ヘッダーファイルおよびライブラリが無い Windows 2000以上でのみ実行可能 |
マニフェストを指定しない場合、Windows 8.1まで正常な答えが得られました。マニフェストを指定しない場合ではWindows 10ではWindows 8相当の答えが返ってきます。 上表の互換モードはexeファイルのプロパティで互換性で設定できる互換モードです。
このページではGetVersionEx APIについて解説します。
以下に本プログラムを各Windowsで実行した例を示します。
Windows 98 Second Edition Windows 2000 Service Pack 4 Windows XP Service Pack 3 Windows Vista Service Pack 2 Windows 7 Service Pack 1 Windows 8.1 Windows 10
Windowsの内部バージョン一覧
Windowsの内部バージョン一覧を以下に示します。
メンバー | NT 3.1 Workstation |
NT 3.5Workstation |
NT 3.51 Workstation |
---|---|---|---|
dwMajorVersion | 3 | 3 | 3 |
dwMinorVersion | 1 | 5 | 51 |
wProductType | 1 | 1 | 1 |
メンバー | NT 4.0 Workstation |
95 | 98 | 98SE | me |
---|---|---|---|---|---|
dwMajorVersion | 4 | 4 | 4 | 4 | 4 |
dwMinorVersion | 0 | 0 | 10 | 10 | 90 |
wProductType | 1 | 0 | 0 | 0 | 0 |
メンバー | 2000 | XP | 2003R2 |
---|---|---|---|
dwMajorVersion | 5 | 5 | 5 |
dwMinorVersion | 0 | 1 | 2 |
wProductType | 1 | 1 | 3 |
メンバー | Vista | 7 | 2008R2 | 8 | 8.1 | 2012 | 2012R2 |
---|---|---|---|---|---|---|---|
dwMajorVersion | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
dwMinorVersion | 0 | 1 | 1 | 2 | 3 | 2 | 3 |
wProductType | 1 | 1 | 3 | 1 | 1 | 3 | 3 |
メンバー | 10 |
---|---|
dwMajorVersion | 10 |
dwMinorVersion | 0 |
wProductType | 1 |
テスト環境
コンパイラ
Visual C++ 2005 ExpressVisual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit
プロジェクトの作成
Win32プロジェクト Windowsアプリケーション実行環境
Windows 8.1 Enterprise 64bitWindows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit
Windows 2000 Professional Service Pack 4(Virtual Box上)
Windows 98 Second Editonl(Virtual Box上)
Windows 98で使用するためにはVisual C++ 2005 Expressでマルチバイトでコンパイルする必要があります。
プログラムソースの概要
最初にOSVERSIONINFO構造体を使用してGetVersionEx APIを呼び出します。
次にOSVERSIONINFOEX構造体を使用してGetVersionEx APIを呼び出し正常に実行できれば、 OSVERSIONINFOEX構造体に取得されたバージョンを表示、 失敗した場合OSVERSIONINFO構造体のバージョンを表示します。
GetVersionEx APIでのOSVERSIONINFO構造体とOSVERSIONINFOEX構造体の区別は、 メンバーdwOSVersionInfoSizeに指定した、構造体サイズで判別されます。
Visual C++ 2013の場合、コンパイル時に「GetVersionExが古い形式として宣言されました」と メッセージが出ますので、#pragma warningで回避しています。
次にOSVERSIONINFOEX構造体を使用してGetVersionEx APIを呼び出し正常に実行できれば、 OSVERSIONINFOEX構造体に取得されたバージョンを表示、 失敗した場合OSVERSIONINFO構造体のバージョンを表示します。
GetVersionEx APIでのOSVERSIONINFO構造体とOSVERSIONINFOEX構造体の区別は、 メンバーdwOSVersionInfoSizeに指定した、構造体サイズで判別されます。
Visual C++ 2013の場合、コンパイル時に「GetVersionExが古い形式として宣言されました」と メッセージが出ますので、#pragma warningで回避しています。
プログラムソース
getversionex.cpp
// GetVersionEx APIを用いてバージョンを取得
// Visual C++ 2005/2008/2013 32/64bit
#include <windows.h>
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,TCHAR* lpsCmdLine, int nCmdShow){
OSVERSIONINFO ver;
ver.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
#if 1600<=_MSC_VER // Visual C++ 2010以上
#pragma warning(push)
#pragma warning(disable : 4996) // GetVersionExが古い形式として宣言されましたを回避
#endif
GetVersionEx(&ver);
TCHAR buf[64];
OSVERSIONINFOEX verex;
verex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (GetVersionEx((OSVERSIONINFO*)&verex))
wsprintf(buf, TEXT("プロダクトID %d , メジャー %d , マイナー%d"), verex.wProductType, verex.dwMajorVersion, verex.dwMinorVersion);
else
wsprintf(buf, TEXT("メジャー %d , マイナー%d"), ver.dwMajorVersion, ver.dwMinorVersion);
#if 1600<=_MSC_VER // Visual C++ 2010以上
#pragma warning(pop)
#endif
MessageBox(0, buf, TEXT("Windows Version"), MB_OK);
return 0;
}
manifest.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>
ソースファイルと実行ファイルのダウンロード
ダウンロード getversionex.zip(75.7kByte)
ZIPファイルに含まれるファイル
ZIPファイルに含まれるファイル
getversion.cpp C++ソースファイル manifest.xml Windows 7~Windows 10までの動作環境を指定したマニフェストファイル getversionex.exe Visual C++ 2013(v120_xp)で上記マニフェストファイルを組み込んで作成した実行ファイル(Windows XP~Windows 10で実行可能) getversionex2008.exe Visual C++ 2008で上記マニフェストファイルを組み込んで作成した実行ファイル(Windows 2000~Windows 10で実行可能) getversionex2005.exe Visual C++ 2005でマルチバイトで作成した実行ファイル(Windows 98~Windows 8.0で実行可能)
Copyright (C) 2012 山本ワールド All Rights Reserved.