C++ 试图将注册表写入HKLM,但将写入HKCR

C++ 试图将注册表写入HKLM,但将写入HKCR,c++,windows,registry,C++,Windows,Registry,我一直在更新旧VisualStudioC++的可执行文件,以与VisualStudio 2010一起工作,并在64位Windows 7上运行。(程序本身是32位的。) 该过程的一部分包括确保注册表读/写/创建仍然有效,和/或更新它们以使用HKEY\U当前用户而不是HKEY\U本地机器。但是,当测试使用RegCreateKeyEx、RegQueryValue、RegSetValue等的注册表函数,并使用ProcessMonitor监视注册表访问时,我注意到一些(可能?)奇怪的行为 当root被指定

我一直在更新旧VisualStudioC++的可执行文件,以与VisualStudio 2010一起工作,并在64位Windows 7上运行。(程序本身是32位的。)

该过程的一部分包括确保注册表读/写/创建仍然有效,和/或更新它们以使用
HKEY\U当前用户
而不是
HKEY\U本地机器
。但是,当测试使用
RegCreateKeyEx
RegQueryValue
RegSetValue
等的注册表函数,并使用ProcessMonitor监视注册表访问时,我注意到一些(可能?)奇怪的行为

当root被指定为
HKEY\U CURRENT\U USER
时,一切似乎都按预期工作。例如,尝试创建密钥时

HKCU\Software\Classes\CLSID\[Guid]
HKLM\Software\Classes\CLSID\[Guid]
ProcessMonitor将显示正在创建的以下键

HKCU\Software\Classes\Wow6432Node\CLSID\[Guid]
HKCR\Wow6432Node\CLSID\[Guid]
这是预期的(64位机器上的32位应用程序)

但是,如果试图创建密钥时根目录是HKEY\U LOCAL\U MACHINE

HKCU\Software\Classes\CLSID\[Guid]
HKLM\Software\Classes\CLSID\[Guid]
ProcessMonitor将显示正在创建的以下键

HKCU\Software\Classes\Wow6432Node\CLSID\[Guid]
HKCR\Wow6432Node\CLSID\[Guid]
这是预期的行为吗?这与限制向HKEY_LOCAL_机器写信有关吗?这是我第一次真正处理注册表访问,所以我不熟悉任何细节。通过一些研究,我了解到
HKEY\U CLASSES\U ROOT
HKCU
HKLM
的某种组合,尽管我不确定这是否相关

该程序以管理员身份运行,UAC已禁用。第一个注册表访问看起来是这样的,带有
pszRootKey='Software/Classes'
,其他所有内容都基于
muhk

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

如果您在禁用UAC的情况下以管理员权限运行程序,这将表明您的问题与用户帐户控制无关。相反,问题很可能是由WOW64引起的。您可以在以下位置找到有关此的更多信息:


您是从内部运行还是从内部运行?实际上两者都是。从VS和在目标计算机(Windows 7 64位)上运行时,结果相同。