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 件のコメント:
コメントを投稿