レジストリを読み取って値を探すコードがいくつかありますが、HKEY_LOCAL_MACHINE\Software\App\
64 ビット バージョンの Windows で実行すると、値はHKEY_LOCAL_MACHINE\Software\Wow6432Node\App\
.
これにどのようにアプローチするのが最善ですか?64 ビットのインストーラーが必要ですか、それともコードを書き直して両方の場所を検出する必要がありますか?
x64 マシンで、レジストリの 32 ビット ビューにアクセスする方法の例を次に示します。
using (var view32 = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser,
RegistryView.Registry32))
{
using (var clsid32 = view32.OpenSubKey(@"Software\Classes\CLSID\", false))
{
// actually accessing Wow6432Node
}
}
…に比べて…
using (var view64 = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser,
RegistryView.Registry64))
{
using (var clsid64 = view64.OpenSubKey(@"Software\Classes\CLSID\", true))
{
....
}
}
C# プログラムを x86 (Any CPU ではなく) としてマークするとHKEY_LOCAL_MACHINE\Software\Wow6432Node\App
、HKEY_LOCAL_MACHINE\Software\App\
.
64 ビット .NET がインストールされている場合、Any CPU 用の .NET プログラムは 64 ビット プロセスとして実行されます。32 ビット レジストリは、Wow6432Node
64 ビット プログラム用の下にあります。
Wallyの回答に+1しますが、彼のソリューションは.NET 4.0以降で機能します。
ここで.NET 2.0でも機能する別のソリューションを見つけました
#region RegHelper
enum RegSAM
{
QueryValue = 0x0001,
SetValue = 0x0002,
CreateSubKey = 0x0004,
EnumerateSubKeys = 0x0008,
Notify = 0x0010,
CreateLink = 0x0020,
WOW64_32Key = 0x0200,
WOW64_64Key = 0x0100,
WOW64_Res = 0x0300,
Read = 0x00020019,
Write = 0x00020006,
Execute = 0x00020019,
AllAccess = 0x000f003f
}
static class RegHive
{
public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
public static UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);
}
static class RegistryWOW6432
{
[DllImport("Advapi32.dll")]
static extern uint RegOpenKeyEx(UIntPtr hKey, string lpSubKey, uint ulOptions, int samDesired, out int phkResult);
[DllImport("Advapi32.dll")]
static extern uint RegCloseKey(int hKey);
[DllImport("advapi32.dll", EntryPoint = "RegQueryValueEx")]
public static extern int RegQueryValueEx(int hKey, string lpValueName, int lpReserved, ref uint lpType, System.Text.StringBuilder lpData, ref uint lpcbData);
static public string GetRegKey64(UIntPtr inHive, String inKeyName, string inPropertyName)
{
return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_64Key, inPropertyName);
}
static public string GetRegKey32(UIntPtr inHive, String inKeyName, string inPropertyName)
{
return GetRegKey64(inHive, inKeyName, RegSAM.WOW64_32Key, inPropertyName);
}
static public string GetRegKey64(UIntPtr inHive, String inKeyName, RegSAM in32or64key, string inPropertyName)
{
//UIntPtr HKEY_LOCAL_MACHINE = (UIntPtr)0x80000002;
int hkey = 0;
try
{
uint lResult = RegOpenKeyEx(RegHive.HKEY_LOCAL_MACHINE, inKeyName, 0, (int)RegSAM.QueryValue | (int)in32or64key, out hkey);
if (0 != lResult) return null;
uint lpType = 0;
uint lpcbData = 1024;
StringBuilder AgeBuffer = new StringBuilder(1024);
RegQueryValueEx(hkey, inPropertyName, 0, ref lpType, AgeBuffer, ref lpcbData);
string Age = AgeBuffer.ToString();
return Age;
}
finally
{
if (0 != hkey) RegCloseKey(hkey);
}
}
}
#endregion
使用法:
string value64 = RegistryWOW6432.GetRegKey64(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");
string value32 = RegistryWOW6432.GetRegKey32(RegHive.HKEY_LOCAL_MACHINE, @"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "RegisteredOrganization");