我在Visual Studio 2010下的调试器中运行Windows 7 64位上的C ++程序(在32位Win XP上运行良好),我无法使用以下代码打开现有的注册表项:
#define ACCESS (KEY_WRITE | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS)
HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_64KEY, &hKey);
if (dwErrorCode != ERROR_SUCCESS)
{
// display error message
}
返回的错误代码为:5,系统消息为“Access is Denied”。
如果我以管理员身份运行Visual Studio 2010,这确实有效,但我宁愿不必这样做。任何人都可以提出建议吗?
更新:我忘了提及,我在这里做的是从Windows XP移植遗留代码。因此,我无法改变软件编写方式的基本结构。由于遗留代码使用注册表,因此移植代码也必须这样做。
另外,我宁愿不对我的特定计算机进行更改 - 因为这意味着我必须更改我想要运行它的每台计算机。由于有很多机器受到影响,这可能会变得混乱。例如,我不想为整台机器关闭UAC。
进一步更新:我还没有找到一个我很满意的解决方案。已决定忽略错误代码5以进行调试,而且现在似乎运行良好。我试图理解像Word,Firefox等标准应用程序似乎是如何使用注册表进行各种设置但尚未提升,我是否必须赋予它们特殊权限才能对注册表进行更改?
答案 0 :(得分:4)
好的,我找到了我的问题的答案,所以我会在这里发布,以防其他人需要它以供将来参考。虽然这个主题实际上是关于C#的主题,但是这个主题证明是有用的。
http://social.msdn.microsoft.com/Forums/da-DK/netfx64bit/thread/92f962d6-7f5e-4e62-ac0a-b8b0c9f552a3
基本上,我需要更改我的权限才能读取32位注册表而不是64位注册表,如下所示:
HKEY hKey;
long dwErrorCode = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\MYTHING", 0, ACCESS|KEY_WOW64_32KEY, &hKey);
if (dwErrorCode != ERROR_SUCCESS)
{
// display error message
}
瞧,瞧,现在一切正常!感谢大家的努力。
更新:事实证明这在我的其他计算机上运行不正常,这让我发现有人必须在我的一台计算机上更改了对32位注册表的访问权限。因此,仍然需要授予用户对您要使用的注册表项的访问权限。
答案 1 :(得分:2)
您需要以提升模式运行该过程,或关闭UAC。您当然可以为您允许访问的特定注册表项分配访问权限。
答案 2 :(得分:0)
我遇到过同样的问题。我已经解决了以下问题:
LPCTSTR subKey = TEXT("Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\App Paths");
LONG openRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_WOW64_32KEY && KEY_ALL_ACCESS, &hKey);