为什么 RegOpenKey() 在 64 位 Win7 上返回错误 2
Why RegOpenKey() returning error 2 on 64 bit Win7
我读过这个Question,它似乎与我所问的内容重复,但我实际上是在问为什么我在两台不同的 Win7 64 位计算机上看到不同的 Wow6432Node 行为
我的 VB6 32 位应用程序正在尝试读取位于
的注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow = N
使用调用 RegOpenKey()。此注册表项由使用 Wise InstallBuilder 8.12 构建的应用程序 32 位安装程序放置在那里。
在我的 64 位 Win7 开发系统上它工作正常。在客户端的 64 位 Win7 计算机上,应用程序出现错误 2 "Not Found"。客户端也安装在 32 位计算机 运行 XP 上并且在那里工作正常。我知道必须发生的事情是应用程序请求从 non-Wow6432Node 读取并且没有在那里找到密钥,因为密钥被重定向到 Wow6432Node
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow =
因为当客户端使用 Regedit 查看 non-Wow6432Node 注册表项时,他们找到了预期的密钥,但没有找到它在 Wow6432Node 位置。我不明白的是,如果应用程序和安装程序都是 32 位程序,为什么它们不同时从 Wow6432Node 写入和读取?如果我们都 运行 相同的安装程序并且都安装了 64 位 Windows,为什么它在我的开发计算机上以一种方式表现而在客户端上表现不同?
我读过这个 link 但我读到的内容似乎与我观察到的 32 位应用程序重定向不符。从我在 link 中读到的内容来看,32 位安装程序和我的 32 位应用程序似乎都应该将它们的注册表项读写到 Wow6432Node。但我观察到的是,在我的 64 位 Win7 开发系统上,安装程序写入 non-Wow6432Node 并且应用程序从 non-Wow6432Node 读取(成功)在客户端的 64 位 Win7 系统上,32 位安装程序写入 non-Wow6432Node 但 32 位应用程序从 Wow6432Node 读取并失败。
这是我的 Win7 开发系统上 类 在 Wow6432Node 和 Non-Wow 部分的 Regedit 视图
SOFTWARE\Wow6432Node\Classes
SOFTWARE\Classes
更新 8-4-2017 我让客户端使用 regedit 在 Wow6432Node 部分手动创建密钥条目,以尝试确认这是一个 Wow6432Node 问题。
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow = N
结果他得到了同样的错误。所以也许我的前提是客户端系统正在尝试读取 Wow3264Node 部分。 还有什么可能导致错误 2? 它在他的 64 位 Win7 系统上失败,但在 32 位 XP 上却没有,这当然看起来很可疑。
这是失败的 VB 代码。请注意,在指定值名称 HideCaptureWindow 之前尝试打开 SigToolESIDevice2016 键时会发生错误。 SigToolESIDevice2016 密钥是通过注册 ActiveX VB 组件创建的,而不是像我之前在安装程序添加 HideCaptureWindow 值时所说的那样:
Called with strPath="SOFTWARE\Classes\SigToolESI.SigToolESIDevice2016"
strValue="HideCaptureWindow"
Private Function RegKeyGetString(hBaseKey As Long, strPath As String, strValue As String)
Dim hKey
Dim status As Long
'Open the key
status = RegOpenKey(hBaseKey, strPath, hKey)
If status <> 0 Then
MsgBox ("RegOpenKey(" & hBaseKey & ", """ & strPath & """, """ & strValue _
& """) = " & status)
RegKeyGetString = ""
Exit Function
End If
'Get the key's content
RegKeyGetString = RegQueryStringValue(hKey, strValue)
'Close the key
RegCloseKey hKey
End Function
事实证明,这与 WOW64 根本无关,而是由于特定客户端没有对注册表项的写入权限以及在尝试读取注册表项时请求 "Full Access" 的代码造成的。非扩展的 RegOpenKey() 假定完全访问权限而不是 READ_ONLY
这是代码更改。
- 'Open the key
-10 status = RegOpenKey(hBaseKey, strPath, hKey)
+ ' Open the key for READ ONLY accesss Some clients were getting
+ ' access error on this call when RegOpenKey() was used which
+ ' requests full access instead of RegOpenKeyEx() with READ ONLY
+ ' access.
+10 status = RegOpenKeyEx(hBaseKey, strPath, 0, KEY_READ, hKey)
我读过这个Question,它似乎与我所问的内容重复,但我实际上是在问为什么我在两台不同的 Win7 64 位计算机上看到不同的 Wow6432Node 行为
我的 VB6 32 位应用程序正在尝试读取位于
的注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow = N
使用调用 RegOpenKey()。此注册表项由使用 Wise InstallBuilder 8.12 构建的应用程序 32 位安装程序放置在那里。 在我的 64 位 Win7 开发系统上它工作正常。在客户端的 64 位 Win7 计算机上,应用程序出现错误 2 "Not Found"。客户端也安装在 32 位计算机 运行 XP 上并且在那里工作正常。我知道必须发生的事情是应用程序请求从 non-Wow6432Node 读取并且没有在那里找到密钥,因为密钥被重定向到 Wow6432Node
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow =
因为当客户端使用 Regedit 查看 non-Wow6432Node 注册表项时,他们找到了预期的密钥,但没有找到它在 Wow6432Node 位置。我不明白的是,如果应用程序和安装程序都是 32 位程序,为什么它们不同时从 Wow6432Node 写入和读取?如果我们都 运行 相同的安装程序并且都安装了 64 位 Windows,为什么它在我的开发计算机上以一种方式表现而在客户端上表现不同?
我读过这个 link 但我读到的内容似乎与我观察到的 32 位应用程序重定向不符。从我在 link 中读到的内容来看,32 位安装程序和我的 32 位应用程序似乎都应该将它们的注册表项读写到 Wow6432Node。但我观察到的是,在我的 64 位 Win7 开发系统上,安装程序写入 non-Wow6432Node 并且应用程序从 non-Wow6432Node 读取(成功)在客户端的 64 位 Win7 系统上,32 位安装程序写入 non-Wow6432Node 但 32 位应用程序从 Wow6432Node 读取并失败。
这是我的 Win7 开发系统上 类 在 Wow6432Node 和 Non-Wow 部分的 Regedit 视图
SOFTWARE\Wow6432Node\Classes
SOFTWARE\Classes
更新 8-4-2017 我让客户端使用 regedit 在 Wow6432Node 部分手动创建密钥条目,以尝试确认这是一个 Wow6432Node 问题。
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow = N
结果他得到了同样的错误。所以也许我的前提是客户端系统正在尝试读取 Wow3264Node 部分。 还有什么可能导致错误 2? 它在他的 64 位 Win7 系统上失败,但在 32 位 XP 上却没有,这当然看起来很可疑。
这是失败的 VB 代码。请注意,在指定值名称 HideCaptureWindow 之前尝试打开 SigToolESIDevice2016 键时会发生错误。 SigToolESIDevice2016 密钥是通过注册 ActiveX VB 组件创建的,而不是像我之前在安装程序添加 HideCaptureWindow 值时所说的那样:
Called with strPath="SOFTWARE\Classes\SigToolESI.SigToolESIDevice2016"
strValue="HideCaptureWindow"
Private Function RegKeyGetString(hBaseKey As Long, strPath As String, strValue As String)
Dim hKey
Dim status As Long
'Open the key
status = RegOpenKey(hBaseKey, strPath, hKey)
If status <> 0 Then
MsgBox ("RegOpenKey(" & hBaseKey & ", """ & strPath & """, """ & strValue _
& """) = " & status)
RegKeyGetString = ""
Exit Function
End If
'Get the key's content
RegKeyGetString = RegQueryStringValue(hKey, strValue)
'Close the key
RegCloseKey hKey
End Function
事实证明,这与 WOW64 根本无关,而是由于特定客户端没有对注册表项的写入权限以及在尝试读取注册表项时请求 "Full Access" 的代码造成的。非扩展的 RegOpenKey() 假定完全访问权限而不是 READ_ONLY 这是代码更改。
- 'Open the key
-10 status = RegOpenKey(hBaseKey, strPath, hKey)
+ ' Open the key for READ ONLY accesss Some clients were getting
+ ' access error on this call when RegOpenKey() was used which
+ ' requests full access instead of RegOpenKeyEx() with READ ONLY
+ ' access.
+10 status = RegOpenKeyEx(hBaseKey, strPath, 0, KEY_READ, hKey)