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 的奇怪行为与另一个寄存器的返回值有关的主要内容,如果未能解决你的问题,请参考以下文章

通过与另一个成员的类成员函数调用线程时的奇怪行为。 CPP

从 RegQueryValueEx 获取正确的值

奇怪的 NSPredicate 行为?

SKPhysicsBody的奇怪行为

bashrc 中的奇怪行为:连接,相同的代码运行/失败 [重复]

iPhone4S 在 Beacon 检测中的奇怪行为