我的任务是更新旧的Visual Studio C ++ COM可执行文件以与Visual Studio 2010一起使用并在64位Windows 7上运行。(程序本身为32位。)
该过程的一部分涉及确保注册表读/写/创建仍然有效和/或更新它们以使用HKEY_CURRENT_USER
而不是HKEY_LOCAL_MACHINE
。但是,在测试使用RegCreateKeyEx
,RegQueryValue
,RegSetValue
等的注册表函数并使用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_ROOT
是HKCU
和HKLM
的某种合并,但我不确定这是否相关。
程序以管理员身份运行,禁用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
答案 0 :(得分:0)
如果在禁用UAC的情况下运行具有管理员权限的程序,则会显示您的问题与用户帐户控制无关。而不是这个,问题很可能是由WOW64引起的。您可以在以下位置找到有关此内容的更多信息: