2013/05/21

ATLでRegistry(VC++でレジストリを弄る方法)

C++でレジストリを弄るプログラムを作っていました(といってもReadだけ)。
ATLを使うことで、APIを直に使うより(少しだけ)簡単に書けることが分かりました。
#include "atlbase.h"

CRegKey cRegistry;
ULONG bufSize = 100;
_TCHAR regValue[100];
LONG resOpen;
resOpen = cRegistry.Open(HKEY_LOCAL_MACHINE,
                  _T("SOFTWARE\\Microsoft\\Windows NT\\xxx"),
                  KEY_WOW64_64KEY | KEY_READ);
// 32ビットOSにおいてはKEY_WOW64_64KEYフラグの指定は影響しない
if (resOpen == NO_ERROR) {
   LONG resQuery;
   resQuery = cRegistry.QueryStringValue(_T("some_key"), regValue, &bufSize);
   // バイナリの場合は cRegistry.QueryBinaryValue(... 
   if (resQuery == NO_ERROR) {
      regValue; // レジストリの値
   }
   cRegistry.Close();
}

cRegistry.Open時の「KEY_WOW64_64KEY」の指定について。
今回は「HKEY_LOCAL_MACHINE」の「SOFTWARE\Microsoft\Windows NT」以下のキーを読みたかったのですが32ビットアプリで64ビット版WindowsのHKEY_LOCAL_MACHINEを読むと「レジストリリダイレクタ」により自動的に「Wow6432」のキーになってしまいます。

今回欲しい「SOFTWARE\Microsoft\Windows NT」以下のキーは64ビット用のエントリにあるので32ビットアプリからも64ビット用エントリを読む必要がありました。
で「KEY_READ」に「KEY_WOW64_64KEY」というフラグを一つ追加しました(「KEY_READ」もビットフラグなのでORで連結)。
このフラグは32ビットOSで動作した時には影響ありません。

逆に、64ビットアプリからWow6432Nodeのレジストリを読みたい(32ビットアプリは当然32ビット用エントリを読みたい)場合、「KEY_WOW64_32KEY」を追加で良いようです。

0 件のコメント:

コメントを投稿