山本ワールド
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 10のバージョン番号をRtlGetVersionのビルド番号から取得する
概要
Windows 10のバージョン番号をレジストリから取得するはコマンドラインで動作します。これをそのままGUIに移植するとレジストリ値の取得ができませんでした。
本プログラムではRtlGetVersion APIのビルド番号とバージョンは一対一で対応するので変換することによりバージョン番号を取得します。
RtlGetVersion APIについてはRtlGetVersion APIによりWindowsバージョンを取得(Windows 10に対応)を参照してください。
本プログラムではRtlGetVersion APIのビルド番号とバージョンは一対一で対応するので変換することによりバージョン番号を取得します。
RtlGetVersion APIについてはRtlGetVersion APIによりWindowsバージョンを取得(Windows 10に対応)を参照してください。
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32bit/64bit マルチバイト/UNICODE実行環境
Windows 10 Home Version 1803 64bitプログラムソースの概要
win10ver2関数
RtlGetVersion関数を動的に実行します。ビルド番号を取得しswitch文により該当するバージョン番号を取得し返します。
ソースコード
// Windows 10のバージョン番号をRtlGetVersionのビルド番号から取得する。
#include <windows.h>
#include <tchar.h>
// DLL内の関数へのポインタ型を定義
typedef void (WINAPI *RtlGetVersion_FUNC)(OSVERSIONINFOEXW*);
int win10ver2(void){
int ver = 0;
HMODULE hMod;
OSVERSIONINFOEXW osw;
hMod = LoadLibrary(TEXT("ntdll.dll"));
RtlGetVersion_FUNC func;
if (hMod){
func = (RtlGetVersion_FUNC)GetProcAddress(hMod, "RtlGetVersion");
if (func == 0){
FreeLibrary(hMod);
return FALSE;
}
ZeroMemory(&osw, sizeof(osw));
osw.dwOSVersionInfoSize = sizeof(osw);
func(&osw);
FreeLibrary(hMod);
if (osw.dwMajorVersion == 10){
switch (osw.dwBuildNumber){
case 10240: ver = 1507; break;
case 10586: ver = 1511; break;
case 14393: ver = 1607; break;
case 15063: ver = 1703; break;
case 16299: ver = 1709; break;
case 17134: ver = 1803; break;
case 17763: ver = 1809; break;
default: ver = 1809; break;
}
return ver;
}
}
return -1;
}
int WIN10VER;
int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, TCHAR* lpsCmdLine, int nCmdShow){
TCHAR buf[16];
WIN10VER=win10ver2();
if (0<WIN10VER){
_stprintf_s(buf, sizeof(buf) / sizeof(buf[0]), _TEXT("Version %d"), WIN10VER);
MessageBox(0,buf,_TEXT("Windows 10") ,MB_OK);
}
else{
MessageBox(0,0,_TEXT("バージョンが正常に取得できませんでした。"),MB_OK);
}
return 0;
}
Copyright (C) 2012 山本ワールド All Rights Reserved.