无法以编程方式读取某些注册表项

时间:2010-09-06 17:11:55

标签: winapi wxwidgets registry

我有一个小应用程序,它读取注册表键字符串值。它运作良好,但由于某种原因,它失败了这个键: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId 尽管处理了HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\

的其他值

它在`HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography \ MachineGuid'上也失败了

我作为管理员运行,这是一个因素吗?我正在运行W7 64bit,另一台W7机器和Vista机器都运行良好。我唯一的猜测是一些许可问题,或者与我运行64位相关。

有什么想法吗?

更新 它似乎与我运行Windows 64bit和\Software\Wow6432Node\的系统有关。我不知道是什么。我同时拥有\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\\Software\Microsoft\Windows NT\CurrentVersion\,但只有后者包含ProductId值...出于某种原因,当我要求关键Windows显然在Wow6432Node中查找时

我们正在使用wxWidgets,但如果需要,可能会直接使用一些win32代码......我们的应用程序是32位应用程序,但目标PC可以运行32位或64位版本的Windows

3 个答案:

答案 0 :(得分:2)

归功于WOW64。这个other question侧重于细节。

答案 1 :(得分:0)

我只是查看了我的注册表,HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ ProductId或MachineGuid没有密钥,这是在Win7 64位上

答案 2 :(得分:0)

我得到以下代码来处理32位XP盒子和64位Win 7盒子。我认为这应该涵盖大多数基础。

// start out trying to read machine guid on 32 bit machine
object value = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", @"MachineGuid", (object) "defaultValue");

if (value != null && value.ToString() != "defaultValue")
{
    return value.ToString();
}

// read machine guid on 64 bit machine
RegistryKey regKeyBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey regKey = regKeyBase.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography", RegistryKeyPermissionCheck.ReadSubTree);
value = regKey.GetValue("MachineGuid", (object) "defaultValue");

regKeyBase.Close();
regKey.Close();

if (value != null && value.ToString() != "defaultValue")
{
    return value.ToString();
}

return string.Empty;