山本ワールド
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 その他キー名・エントリー名を指定してレジストリを読出しデータ値を標準出力に表示する
概要
レジストリを読出す基本的なプログラムです。
あらかじめキー名とエントリー名がわかっている場合に使用できます。
キー名とは、下図の左側のウィンドウに表示されている内容であり、エントリー名は右側のウィンドウの名前の列に表示されています。
キー名とエントリー名は_tmain関数内で定義されている変数で指定します。(findkey,entry)
エントリー名が定義されていない場合の処理を確認するためにテストパターンを3個用意しています。
エントリーのデータはRegQueryValueEx APIで取得しています。APIの挙動を確認するために TESTマクロの定義でテストパターンを選択できます。
動作確認したパソコンのレジストリの定義は以下のとおりです。
以下に実行結果を示します。
#define TEST 1の場合 キー Environment エントリー TEMP
TEST 2は名前の無いエントリー名が存在しそのエントリーにはデータが定義されていないので、エントリーが無いと表示される。
TEST 3は名前の無いエントリー名が存在しそのエントリーにはデータが定義されているので、データーが表示される。
あらかじめキー名とエントリー名がわかっている場合に使用できます。
キー名とは、下図の左側のウィンドウに表示されている内容であり、エントリー名は右側のウィンドウの名前の列に表示されています。
キー名とエントリー名は_tmain関数内で定義されている変数で指定します。(findkey,entry)
エントリー名が定義されていない場合の処理を確認するためにテストパターンを3個用意しています。
エントリーのデータはRegQueryValueEx APIで取得しています。APIの挙動を確認するために TESTマクロの定義でテストパターンを選択できます。
動作確認したパソコンのレジストリの定義は以下のとおりです。
以下に実行結果を示します。
#define TEST 1の場合 キー Environment エントリー TEMP
"Environment","TEMP",REG_EXPAND_SZ,"%USERPROFILE%\AppData\Local\Temp"#define TEST 2の場合 キー Environment エントリー 既定値
エントリーが見つかりませんでした。#define TEST 3の場合 キー AppEvents\Schemes\Apps\.Default エントリー 既定値
"AppEvents\Schemes\Apps\.Default","",REG_SZ,"Windows"実行結果について解説すると、TEST 1はエントリー名とデーターが存在するので、データが表示されている。
TEST 2は名前の無いエントリー名が存在しそのエントリーにはデータが定義されていないので、エントリーが無いと表示される。
TEST 3は名前の無いエントリー名が存在しそのエントリーにはデータが定義されているので、データーが表示される。
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32bit/64bit マルチバイト/UNICODE実行環境
Windows 7 Enterprise Service Pack 1 64bitプログラムソースの概要
RegOpenKeyEx APIによりキーを開きます。READ_KEY属性を付加して書込みできないようにしておきます。
RegQueryValueEx APIにRegOpenKeyEx APIで取得したkeyハンドルとエントリー名等を指定して呼び出します。エントリー名が既定値の場合は、空白文字(_TEXT(""))又はNULLを渡します。
RegQueryValueEx APIから返される値によりデータの型を特定します。お気づきとは思いますが、本サンプルでは、REG_SZとREG_EXPAND_SZのみサポートしています。
RegCloseKey APIによりRegOpenKeyEx APIで取得したハンドルを閉じます。
RegQueryValueEx APIにRegOpenKeyEx APIで取得したkeyハンドルとエントリー名等を指定して呼び出します。エントリー名が既定値の場合は、空白文字(_TEXT(""))又はNULLを渡します。
RegQueryValueEx APIから返される値によりデータの型を特定します。お気づきとは思いますが、本サンプルでは、REG_SZとREG_EXPAND_SZのみサポートしています。
RegCloseKey APIによりRegOpenKeyEx APIで取得したハンドルを閉じます。
ソースコード
// キー名・エントリー名を指定してレジストリを読出しデータ値を標準出力に表示する
// キー名・エントリー名はTESTマクロで数字で指定してください
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#define TEST 1 // テストパターンを指定1~3
void _tmain(void){
#if TEST==1
TCHAR* findKey = _TEXT("Environment");
TCHAR* entry = _TEXT("TEMP");
#endif
#if TEST==2
TCHAR* findKey = _TEXT("Environment");
TCHAR* entry = _TEXT(""); // 又は TCHAR* entry=NULL (既定)つまりエントリー名がない場合を示す
#endif
#if TEST==3
TCHAR* findKey = _TEXT("AppEvents\\Schemes\\Apps\\.Default");
TCHAR* entry = _TEXT(""); // 又は TCHAR* entry=NULL
#endif
_tsetlocale(LC_ALL, _TEXT("")); // UNICODE文字を標準出力に正しく表示できるように
HKEY hKey;
DWORD dwResult;
dwResult = RegOpenKeyEx(HKEY_CURRENT_USER, findKey, 0, KEY_READ, &hKey);
if (dwResult != ERROR_SUCCESS){
_putts(_TEXT("レジストリのキーが開けませんでした。"));
exit(1);
}
DWORD type;
BYTE data[1024];
DWORD cbData = sizeof(data);
dwResult = RegQueryValueEx(hKey, entry, NULL, &type, data, &cbData);
if (dwResult == ERROR_SUCCESS){
switch (type){
case REG_SZ:
_tprintf(_TEXT("\"%s\",\"%s\",REG_SZ,\"%s\"\n"), findKey, entry, (TCHAR*)data);
break;
case REG_EXPAND_SZ:
_tprintf(_TEXT("\"%s\",\"%s\",REG_EXPAND_SZ,\"%s\"\n"), findKey, entry, (TCHAR*)data);
break;
}
}
else{
_putts(_TEXT("エントリーが見つかりませんでした。"));
exit(1);
}
RegCloseKey(hKey);
}
Copyright (C) 2012 山本ワールド All Rights Reserved.