わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

レジストリの読出し(64bit)

レジストリの値を読み出すには、RegQueryValueEx()関数を使います。WOW64(64bit)のレジストリのデータを読み出すには、 レジストリキーハンドルを取得する際に、RegOpenKeyEx()関数の権限に、KEY_WOW64_64KEYを付加してキーハンドルを取得します。

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <windows.h>



/*
	レジストリの読出し(64bit)

		WOW64 の影響を受けるレジストリ キー 
			https://msdn.microsoft.com/ja-jp/library/aa384253(v=vs.85).aspx
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// std::wcoutのロケールを設定
	std::wcout.imbue( std::locale( "", std::locale::ctype ) );

	// エラーコード
	HRESULT hResult = S_OK;

	{
		// 戻り値
		DWORD dwResult = 0;

		// HKEY
		HKEY hKey = NULL;

		/*
			レジストリオープン
		*/
		dwResult = ::RegOpenKeyEx(
				  HKEY_LOCAL_MACHINE						// レジストリキー
				, L"SOFTWARE¥¥Microsoft¥¥Internet Explorer"	// レジストリサブキー
				, 0											// Reserved(0固定)
				, KEY_QUERY_VALUE							// アクセス権
				| KEY_WOW64_64KEY							// 64bitレジストリ
				, &hKey										// キーハンドルの受け取り位置
			);
		if ( ERROR_SUCCESS != dwResult ) {

			// エラー
			hResult = ::HRESULT_FROM_WIN32( dwResult );
			goto err;
		}


		// データの読出しバッファ
		TCHAR waReadBuf[ MAX_PATH ];

		// データの読出しバッファのサイズ(文字数では無くバイト数) / 読みだしたサイズ
		DWORD dwReadSize = sizeof( waReadBuf );

		// 読みだしたデータのタイプ(RegEnumValue)
		DWORD dwType = 0;


		/*
			レジストリの値を取得
				InternetExprolerのバージョン情報
		*/
		dwResult = ::RegQueryValueEx(
				  hKey				// キーハンドル
				, L"svcVersion"		// ValueName
				, 0					// Reserved(0固定)
				, &dwType			// 読みだしたデータの型
				, (LPBYTE)waReadBuf	// 読みだし位置
				, &dwReadSize		// Input: 読み出しバッファサイズ / Output読みだしたサイズ
			);
		if ( ERROR_SUCCESS != dwResult ) {

			// エラー
			hResult = ::HRESULT_FROM_WIN32( dwResult );
			goto err;
		}


		/*
			読みだした内容の出力
		*/
		std::wcout << L"読みだした値         = " << waReadBuf  << std::endl;
		std::wcout << L"読みだしたサイズ     = " << dwReadSize << std::endl;
		std::wcout << L"読みだしたデータの型 = ";
		switch( dwType ) {
		case REG_BINARY:              std::wcout << L"REG_BINARY"; break;
		case REG_DWORD:               std::wcout << L"REG_DWORD / REG_DWORD_LITTLE_ENDIAN"; break;
		case REG_DWORD_BIG_ENDIAN:    std::wcout << L"REG_DWORD_BIG_ENDIAN"; break;
		case REG_EXPAND_SZ:           std::wcout << L"REG_EXPAND_SZ"; break;
		case REG_LINK:                std::wcout << L"REG_LINK"; break;
		case REG_MULTI_SZ:            std::wcout << L"REG_MULTI_SZ"; break;
		case REG_NONE:                std::wcout << L"REG_NONE"; break;
		case REG_QWORD:               std::wcout << L"REG_QWORD / REG_QWORD_LITTLE_ENDIAN"; break;
		case REG_RESOURCE_LIST:       std::wcout << L"REG_RESOURCE_LIST"; break;
		case REG_SZ:                  std::wcout << L"REG_SZ"; break;
		}
		std::wcout << std::endl;

err:
		// キーハンドルの破棄
		if ( NULL != hKey ) {
			::RegCloseKey( hKey );
		}
	}

	// 処理結果を返す
	return( 0 );
}



実行結果

読みだした値         = 11.103.14393.0
読みだしたサイズ     = 30
読みだしたデータの型 = REG_SZ






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。