尝试向HKLM写入注册表写入HKCR

时间:2014-07-08 13:58:47

标签: c++ windows registry

我的任务是更新旧的Visual Studio C ++ COM可执行文件以与Visual Studio 2010一起使用并在64位Windows 7上运行。(程序本身为32位。)

该过程的一部分涉及确保注册表读/写/创建仍然有效和/或更新它们以使用HKEY_CURRENT_USER而不是HKEY_LOCAL_MACHINE。但是,在测试使用RegCreateKeyExRegQueryValueRegSetValue等的注册表函数并使用ProcessMonitor观察注册表访问时,我注意到一些(可能是?)奇怪的行为。

当根目录指定为HKEY_CURRENT_USER时,一切似乎都按预期工作。例如,在尝试创建密钥时

HKCU\Software\Classes\CLSID\[Guid]

ProcessMonitor将显示正在创建的以下密钥

HKCU\Software\Classes\Wow6432Node\CLSID\[Guid]

预期(64位机器上的32位应用程序)。

但是,如果在尝试创建密钥时根目录为HKEY_LOCAL_MACHINE

HKLM\Software\Classes\CLSID\[Guid]

ProcessMonitor将显示正在创建的以下密钥

HKCR\Wow6432Node\CLSID\[Guid]

这是预期的行为吗?是否与写入HKEY_LOCAL_MACHINE的限制有关?这是我第一次真正处理注册表访问,所以我并不熟悉任何细节。通过一些研究,我了解到HKEY_CLASSES_ROOTHKCUHKLM的某种合并,但我不确定这是否相关。

程序以管理员身份运行,禁用UAC。第一个注册表访问看起来像这样,pszRootKey = 'Software/Classes',其他所有内容都建立在m_hk

之外
dwErr = RegCreateKeyEx(
        HKEY_LOCAL_MACHINE, pszRootKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL,
        &m_hk, NULL
        );

编辑:

当单步执行代码时,上面调用RegCreateKeyEx()会在ProcessMonitor中生成以下内容:

 Operation     | Path | Result  | Detail
---------------------------------------------------------------------------------
 RegQueryKey   | HKLM | SUCCESS | Query: HandleTags, HandleTags: 0x0
 RegCreateKey  | HKCR | SUCCESS | Desired Access: All Access, Disposition:REG_OPENED_EXISTING_KEY
 RegSetInfoKey | HKCR | SUCCESS | KeySetInformationClass: KeySetHandleTagsInformation, Length: 0

1 个答案:

答案 0 :(得分:0)

如果在禁用UAC的情况下运行具有管理员权限的程序,则会显示您的问题与用户帐户控制无关。而不是这个,问题很可能是由WOW64引起的。您可以在以下位置找到有关此内容的更多信息: