试图向HKLM写入registry而不是写入HKCR

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

该过程的一部分涉及确保registry读/写/创build仍然工作和/或更新他们使用HKEY_CURRENT_USER而不是HKEY_LOCAL_MACHINE 。 但是,在testing使用RegCreateKeyExRegQueryValueRegSetValue等的registry函数并使用ProcessMonitor观察registry访问时,我注意到了一些(可能的)奇怪的行为。

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

 HKCU\Software\Classes\CLSID\[Guid] 

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

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

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

但是,如果尝试创build密钥时根是HKEY_LOCAL_MACHINE

 HKLM\Software\Classes\CLSID\[Guid] 

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

 HKCR\Wow6432Node\CLSID\[Guid] 

这是预期的行为? 与写入HKEY_LOCAL_MACHINE的限制有什么关系? 这是我第一次真正处理registry访问,所以我不是任何细节的家庭。 通过一些研究,我了解到HKEY_CLASSES_ROOTHKCUHKLM某种forms,尽pipe我不确定这是否相关。

程序以UAC禁用的pipe理员身份运行。 第一个registry访问看起来是这样的, pszRootKey = 'Software/Classes' ,其他所有东西都build立在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 

如果您在禁用UAC的情况下以管理员权限运行程序,则会显示您的问题与用户帐户控制无关。 而不是这个,这个问题很可能是由WOW64造成的。 你可以在这些位置找到更多关于这方面的信息:

  • 注册表重定向器
  • 受WOW64影响的注册表键