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 找不到注册表项

RegOpenKeyEx 在 MASM64 中返回错误 87

RegOpenKeyEx 返回错误 161

尝试更改 ActivePowerScheme:RegOpenKeyEx 失败,错误 0

RegCreateKeyEx 和 RegOpenKeyEx 成功但 RegSetValueEx 无法设置值