RegQueryValueEx 的奇怪行为与另一个寄存器的返回值有关
Posted
技术标签:
【中文标题】RegQueryValueEx 的奇怪行为与另一个寄存器的返回值有关【英文标题】:Strange behaviour with RegQueryValueEx whitch return value of another register 【发布时间】:2016-11-10 21:05:19 【问题描述】:我想从注册表中获取 Excel.exe 的路径。所以我使用了以下内容:
我使用的是 Windows64 位
RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey, 0, KEY_READ, &hKey)
与
szKey = "\Classes\CLSID\ExcelCLSID\LocalServer",
此寄存器包含“C:\PROGRA~1\MIF5BA~1\Office15\EXCEL.EXE /automation”
用它来获取 Excel.exe 路径
RegQueryValueEx(hKey, NULL, NULL, NULL, (BYTE*)szPath, &cSize)
所以在为平台 x64 构建我的解决方案时,我得到了路径
C:\\PROGRA~1\\MIF5BA~1\\Office15\\EXCEL.EXE /automation
很好,但是在为 Win32 平台构建我的解决方案时,我得到了 跟随路径
"C:\\Program Files\\Microsoft Office\\Office15\\EXCEL.EXE" /automation
这是奇怪,因为这个值存储在以下注册表中
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\ExcelCLSID\
我错过了什么吗?
【问题讨论】:
【参考方案1】:Windows 注册表或多或少地透明地维护在同一环境中运行的 32 位和 64 位应用程序的不同信息。您看到的Wow6432Node
表示该键的值特定于在 64 位版本的 Windows 上运行的 32 位应用程序。
您可以禁用默认注册表重定向(请参阅RegDisableReflectionKey),但在大多数情况下,这不是您想要做的。
查看注册表重定向信息here。
【讨论】:
我认为问题出在指定要打开的密钥的所需访问权限的掩码中,因此在运行 32 位进程时从 windows64 位注册表读取我应该使用 KEY_READ |KEY_WOW64_64KEY 而不是只在 RegOpenKeyEx 的调用中使用 KEY_READ。以上是关于RegQueryValueEx 的奇怪行为与另一个寄存器的返回值有关的主要内容,如果未能解决你的问题,请参考以下文章