C++ 试图将注册表写入HKLM,但将写入HKCR
我一直在更新旧VisualStudioC++的可执行文件,以与VisualStudio 2010一起工作,并在64位Windows 7上运行。(程序本身是32位的。) 该过程的一部分包括确保注册表读/写/创建仍然有效,和/或更新它们以使用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被指定
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引起的。您可以在以下位置找到有关此的更多信息: