Windows 10のバージョン番号をレジストリから取得する

icon 項目のみ表示/展開表示の切り替え

概要

レジストリよりWindows 10のプロダクト名とバージョン番号を取得しコマンドプロンプトに表示します。以下に実行結果とwinver.exeの実行結果とレジストリエディタの実行例を示します。
        
Windows 10 Home Version 1803
いずれかのキーを押すと終了します。


レジストリの取得方法は、キー名・エントリー名を指定してレジストリを読出しデータ値を標準出力に表示するを参照してください。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32bit/64bit マルチバイト/UNICODE

実行環境

Windows 10 Home Version 1803 64bit

プログラムソースの概要

win10ver関数

RegOpenKeyEx APIによりキーを開きます。READ_KEY属性を付加して書込みできないようにしておきます。
RegQueryValueEx APIにRegOpenKeyEx APIで取得したkeyハンドルとエントリー名等を指定して呼び出します。エントリー名が既定値の場合は、空白文字(_TEXT(""))又はNULLを渡します。
RegQueryValueEx APIから返される値によりデータの型を特定します。REG_SZのみを対象としています。
エントリ名はProductName,ReleaseIdについて値を取得します。
ReleaseIdについては文字列をint型の数値に変換してバージョン番号返します。
RegCloseKey APIによりRegOpenKeyEx APIで取得したハンドルを閉じます。

ソースコード

// Windows 10のバージョン番号をレジストリから取得する。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>

// OSの名称とバージョンを取得する。
int win10ver(TCHAR* name,int sz){
	TCHAR* findKey = _TEXT("SOFTWARE¥¥Microsoft¥¥Windows NT¥¥CurrentVersion");
	HKEY hKey;
	DWORD dwResult;
	int ver = 0;
	name[0] = 0;
	dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, findKey, 0, KEY_READ, &hKey);
	if (dwResult != ERROR_SUCCESS){
		return -1;
	}

	DWORD type;
	BYTE data[1024];
	DWORD cbData = sizeof(data);
	dwResult = RegQueryValueEx(hKey, _TEXT("ProductName"), NULL, &type, data, &cbData);
	if (dwResult == ERROR_SUCCESS){
		switch (type){
		case REG_SZ:
			_tcscpy_s(name,sz,(TCHAR*)data);
			break;
		}
	}
	dwResult = RegQueryValueEx(hKey, _TEXT("ReleaseId"), NULL, &type, data, &cbData);
	if (dwResult == ERROR_SUCCESS){
		switch (type){
		case REG_SZ:
			ver = _ttoi((TCHAR*)data);
			break;
		default:
			ver = -1;
			break;
		}
	}
	else{
		ver = -1;;
	}
	RegCloseKey(hKey);
	return ver;
}

void _tmain(void){
	_tsetlocale(LC_ALL, _TEXT(""));	//	UNICODE文字を標準出力に正しく表示できるように
	TCHAR name[32];
	int ver=win10ver(name,sizeof(name)/sizeof(name[0]));
	if (_tcsstr(name, _TEXT("Windows 10")) && 0<ver){
		_tprintf(_TEXT("%s Version %d¥n"), name, ver);
	}
	else{
		_tprintf(_TEXT("バージョンが正常に取得できませんでした。¥n"));
	}
	_tprintf(_TEXT("いずれかのキーを押すと終了します。¥n"));
	getchar();
}

実行ファイルとソースファイルのダウンロード