windowsのプロダクトキーを取得する

WindowsXP以降のプロダクトキーを取得する方法のメモ

以下の作法で、レジストリキーの読み取りを行う。

レジストリキーのオープン処理関数をコール
 RegCreateKeyEx(...)関数を実施

レジストリキーの読み込み処理関数をコール
 RegQueryValueEx(...)

レジストリキーのクローズ処理関数をコール
 RegCloseKey(...)

以下、サンプルコード=======

CString strPathName = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
CString strValueName = _T("DigitalProductId");

HKEY hKey; // キーハンドル
DWORD dwDisposition; // 処理結果を受け取る
LONG lResult; // 関数の戻り値を格納する
DWORD dwType; // 値の種類を受け取る
DWORD dwSize; // 値のサイズを受け取る
BYTE byPdky[MAX_PATH]; // プロダクトキーを受け取る
CString strPdky = _T("");
CString strTmpPdky = _T("");

dwType = REG_BINARY;

// 初期化
memset( &byPdky, '\0', MAX_PATH );

// レジストリオープン処理
lResult = ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, strPathName, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
if( ERROR_SUCCESS != lResult ){
MessageBox(_T("RegCreateKeyEx() Error"), MB_OK, MB_ICONERROR );
return;
}

// レジストリ読み込み処理
lResult = ::RegQueryValueEx( hKey, strValueName, NULL, &dwType, NULL, &dwSize );
lResult = ::RegQueryValueEx( hKey, strValueName, NULL, &dwType, byPdky, &dwSize );
if( ERROR_SUCCESS != lResult ){
MessageBox(_T("RegQueryValue() Error"), MB_OK, MB_ICONERROR );
return;
}

// レジストリクローズ処理
::RegCloseKey( hKey );


ただし、WindowsXP以降はプロダクトキーが記録されているキー名DigitalProductIdは、
REG_BINARYで暗号化?されている。
VC++ではどうやるか考え中。
VC++以外の方法は何個かみつけてるんだが…。