山本ワールド
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のバージョン番号をレジストリから取得する
概要
レジストリより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();
}
Copyright (C) 2012 山本ワールド All Rights Reserved.