regopenkeyex 在 Windows 8.1 上返回 2
Posted
技术标签:
【中文标题】regopenkeyex 在 Windows 8.1 上返回 2【英文标题】:regopenkeyex returns 2 on Windows 8.1 【发布时间】:2017-06-05 02:29:44 【问题描述】:我有一个 32 位程序,它在同一家商店的两条通道中运行。该程序尝试打开一个注册表项进行查询。操作系统为Windows 8.1 64位。
一个通道成功,另一个通道失败,regopenkeyex 返回 2。GetLastError 返回 0。
它试图打开的密钥在 WOW6432Node 下。
程序在两台机器上以相同的 Windows 用户运行,密钥在两台机器上都存在。 UAC 设置为“从不通知”(最低),windows 版本相同。一切都应该是一样的......
我故意不指定 KEY_WOW64_64KEY 因为代码应该在没有它的情况下工作。但即使我确实使用它,我也会得到相同的结果。
这可能是什么原因造成的?
代码:
rc = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
szKey,
0,
KEY_QUERY_VALUE,
&m_hKey);
谢谢。
【问题讨论】:
什么是szKey?店里有两条车道是什么意思? 1. szKey 是什么并不重要。 2. 该程序在一个有多个通道(结账)的零售店中运行。它对一个失败,对其他人有效。 当然重要! 【参考方案1】:您实际上需要了解您在 MSDN 上使用的功能。注册表函数直接返回错误码,不使用GetLastError
!
2 是 ERROR_FILE_NOT_FOUND
,所以无论您隐藏在 szKey
中的什么,都不是有效的子键路径。
WOW6432Node 是一个您确实不应该使用的保留键名,如果您需要在 64 位应用程序中访问 32 位注册表视图,请使用 KEY_WOW64_32KEY
。 32 位应用程序默认读取 WOW6432Node 键下的键。
使用Process Monitor 确保您访问的是正确的密钥。
【讨论】:
我知道。您在不理解我写的内容的情况下给出负面反馈。我读到的密钥是这样的:“SOFTWARE\\XXX\\YYY\\ZZZ”,XXX 位于 WOW6432Node 下。我写了函数返回 2。所以我也调用了 GetLastError,那又怎样?主要是函数返回 2,而在 PC 上设置的同一个程序完全一样返回 0。我希望这对你来说已经足够清楚了。 所以一台电脑有钥匙,另一台没有? 两台电脑都有钥匙。 进程监视器说什么? 很明显,钥匙并不像我一直在说的那样。这应该不是问题,您要求的是 KEY_QUERY_VALUE 所以这是一个 read 操作,您应该能够处理不存在的键/值(用户“清理”注册表等) .以上是关于regopenkeyex 在 Windows 8.1 上返回 2的主要内容,如果未能解决你的问题,请参考以下文章
RegOpenKeyExA 和 RegOpenKeyEx 有啥区别
RegOpenKeyEx 在 MASM64 中返回错误 87