山本ワールド
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)
動作確認したパソコンのレジストリの定義は以下のとおりです。
以下に実行結果の一部を示します。
キー名とは、下図の左側のウィンドウに表示されている内容であり、エントリー名は右側のウィンドウの名前の列に表示されています。
キー名は_tmain関数内で定義されている変数で指定します。(findkey)
動作確認したパソコンのレジストリの定義は以下のとおりです。
以下に実行結果の一部を示します。
"AppEvents\Schemes\Apps\.Default\.Default\.Current","",REG_SZ,"C:\Windows\media\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\.Default","",REG_EXPAND_SZ,"%SystemRoot%\media\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Afternoon","",REG_SZ,"C:\Windows\Media\Afternoon\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Calligraphy","",REG_SZ,"C:\Windows\Media\Calligraphy\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Characters","",REG_SZ,"C:\Windows\Media\Characters\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Cityscape","",REG_SZ,"C:\Windows\Media\Cityscape\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Delta","",REG_SZ,"C:\Windows\Media\Delta\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Festival","",REG_SZ,"C:\Windows\Media\Festival\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Garden","",REG_SZ,"C:\Windows\Media\Garden\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Heritage","",REG_SZ,"C:\Windows\Media\Heritage\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Landscape","",REG_SZ,"C:\Windows\Media\Landscape\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Quirky","",REG_SZ,"C:\Windows\Media\Quirky\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Raga","",REG_SZ,"C:\Windows\Media\Raga\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Savanna","",REG_SZ,"C:\Windows\Media\Savanna\Windows Ding.wav" "AppEvents\Schemes\Apps\.Default\.Default\Sonata","",REG_SZ,"C:\Windows\Media\Sonata\Windows Ding.wav"この実行結果を見て鋭い人は気がついているかもしれませんが、Windowsのサウンドイベントに対するwavファイルの設定です。
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32bit/64bit マルチバイト/UNICODE実行環境
Windows 7 Enterprise Service Pack 1 64bit(Power User)プログラムソースの概要
キーの中にサブキーがあることがありますので、キーを検索する関数(listKey)を定義し、サブキーが見つかった場合は再帰呼び出しにより処理します。
fullKeyにはキーの完全名が保存されます。
RegOpenKeyEx APIによりキーを開きます。READ_KEY属性を付加して書込みできないようにしておきます。
RegEnumKeyEx APIの第2引数にdwIndex=0,第4引数にバッファサイズを指定して呼び出しサブキーを取得します。
RegEnumKeyEx APIの戻り値がERROR_SUCCESSの場合は正常に取得できたので、サブキーを取り出し、キーとサブキーを結合してlistKey関数を再帰呼出しを行います。
dwIndexに1を加算し、RegEnumKeyEx APIの戻り値がERROR_NO_MORE_ITEMSになるまで連続して呼び出します。
サブキーの取得が終わったら、エントリーとデーターの取得をkeyValue関数で行います。 RegCloseKey APIによりRegOpenKeyEx APIで取得したハンドルを閉じます。
エントリーを列挙するために、第2引数にdwIndex=0を指定してRegEnumValue APIを呼び出します。
エントリー名とデータを取り出し表示します。お気づきとは思いますが、本サンプルでは、REG_SZとREG_EXPAND_SZのみサポートしています。
dwIndexに1を加算して、RegEnumValue APIの戻り値がERROR_NO_MORE_ITEMSになるまで連続して呼び出します。
fullKeyにはキーの完全名が保存されます。
listKey
サブキー・エントリー・データの取得を行うメイン関数です。RegOpenKeyEx APIによりキーを開きます。READ_KEY属性を付加して書込みできないようにしておきます。
RegEnumKeyEx APIの第2引数にdwIndex=0,第4引数にバッファサイズを指定して呼び出しサブキーを取得します。
RegEnumKeyEx APIの戻り値がERROR_SUCCESSの場合は正常に取得できたので、サブキーを取り出し、キーとサブキーを結合してlistKey関数を再帰呼出しを行います。
dwIndexに1を加算し、RegEnumKeyEx APIの戻り値がERROR_NO_MORE_ITEMSになるまで連続して呼び出します。
サブキーの取得が終わったら、エントリーとデーターの取得をkeyValue関数で行います。 RegCloseKey APIによりRegOpenKeyEx APIで取得したハンドルを閉じます。
keyValue
キーハンドルより含まれるエントリーとデーターを検索します。エントリーを列挙するために、第2引数にdwIndex=0を指定してRegEnumValue APIを呼び出します。
エントリー名とデータを取り出し表示します。お気づきとは思いますが、本サンプルでは、REG_SZとREG_EXPAND_SZのみサポートしています。
dwIndexに1を加算して、RegEnumValue APIの戻り値がERROR_NO_MORE_ITEMSになるまで連続して呼び出します。
ソースコード
// レジストリ \HKEY_CURRENT_USER\AppEvent\Schemes\Apps\.Default を標準出力に一覧表示する
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
// サブキーの検索
void listKey(HKEY hRootKey, TCHAR* key, TCHAR* fullKey, DWORD fullKeySz);
// エントリーに含まれるデータを表示
void keyValue(HKEY hKey, TCHAR* fullKey);
// エントリのデータを表示
void putData(DWORD type, BYTE* data, DWORD sz);
void _tmain(void){
TCHAR* findKey = _TEXT("AppEvents\\Schemes\\Apps\\.Default");
TCHAR fullKey[1024];
_tcscpy_s(fullKey, sizeof(fullKey) / sizeof(TCHAR), findKey);
listKey(HKEY_CURRENT_USER, findKey, fullKey, sizeof(fullKey) / sizeof(TCHAR));
}
// サブキーの検索
void listKey(HKEY hRootKey, TCHAR* key, TCHAR* fullKey, DWORD fullKeySz){
HKEY hKey;
DWORD dwResult;
dwResult = RegOpenKeyEx(hRootKey, key, 0, KEY_READ, &hKey);
if (dwResult != ERROR_SUCCESS){
_putts(_TEXT("error"));
exit(1);
}
DWORD dwIndex;
FILETIME ftLastWriteTime;
TCHAR subKey[1024];
int sz = _tcslen(fullKey);
// サブキーの列挙
for (dwIndex = 0;; dwIndex++){
DWORD subKeySz = sizeof(subKey) / sizeof(TCHAR);
dwResult = RegEnumKeyEx(hKey, dwIndex, subKey, &subKeySz, NULL, NULL, NULL, &ftLastWriteTime);
if (dwResult == ERROR_NO_MORE_ITEMS)
break;
if (dwResult == ERROR_SUCCESS){
_tcscat_s(fullKey, fullKeySz, _TEXT("\\"));
_tcscat_s(fullKey, fullKeySz, subKey);
listKey(hKey, subKey, fullKey, fullKeySz);
fullKey[sz] = _T('\0');
}
}
// エントリーの列挙
keyValue(hKey, fullKey);
RegCloseKey(hKey);
}
// エントリーに含まれるデータを表示
void keyValue(HKEY hKey, TCHAR* fullKey){
DWORD dwResult;
DWORD dwIndex;
TCHAR entry[1024];
DWORD entrySz;
DWORD type;
BYTE data[1024];
for (dwIndex = 0;; dwIndex++){
entrySz = sizeof(entry) / sizeof(TCHAR);
DWORD cbData = sizeof(data);
dwResult = RegEnumValue(hKey, dwIndex, entry, &entrySz, NULL, &type, data, &cbData);
if (dwResult == ERROR_SUCCESS){
_tprintf(_TEXT("\"%s\",\"%s\","), fullKey, entry);
putData(type, data, cbData);
_tprintf(_TEXT("\n"));
}
if (dwResult == ERROR_NO_MORE_ITEMS)
break;
}
}
// エントリのデータを表示
void putData(DWORD type, BYTE* data, DWORD sz){
switch (type){
case REG_SZ:
_tprintf(_TEXT("REG_SZ,\"%s\""), (TCHAR*)data);
break;
case REG_EXPAND_SZ:
_tprintf(_TEXT("REG_EXPAND_SZ,\"%s\""), (TCHAR*)data);
break;
default:
_tprintf(_TEXT("%d,"), type);
for (DWORD n = 0; n<sz; n++){
_tprintf(_TEXT("%0.2x "), data[n]);
}
break;
}
}
Copyright (C) 2012 山本ワールド All Rights Reserved.