为什么RegOpenKey()返回错误2在64位Win7

问题描述:

我读过这Question这似乎是我问的重复,但我实际上是问为什么我看到不同的Wow6432Node行为在两个不同的Win7 64位电脑为什么RegOpenKey()返回错误2在64位Win7

我的VB6的32位应用程序试图读取在

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow = N 

使用调用RegOpenKey()一个注册表项。这个注册表键放在了由Wise InstallBuilder 8.12构建的应用程序32位安装程序中。 在我的64位Win7开发系统上,它工作正常。在客户端的64位Win7计算机上,该应用程序出现错误2“未找到”。客户端也安装在运行XP的32位计算机上,并且在那里工作正常。我明白,什么是必须要发生的事情是应用程序请求从非Wow6432Node阅读并没有找到钥匙那里,因为钥匙被重定向到Wow6432Node

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\SigToolESI.SigToolESIDevice2016 HideCaptureWindow = 

因为当客户端查找与注册表非Wow6432Node注册表项他们找到预期的密钥,但他们没有找到它在Wow6432Node的位置。我不明白的是,如果应用程序和安装程序都是32位程序,为什么它们都不能从Wow6432Node中读写?为什么它在我的开发计算机上以单向方式运行,如果我们都运行相同的安装程序,并且都安装了64位Windows,那么它们在客户端上的行为是不同的?

我读过这个link但我读的内容似乎与我观察的32位应用程序的重定向不匹配。从我读到的链接看起来好像32位安装程序和我的32位应用程序应该读取和写入他们的注册表项到Wow6432Node。但我观察到的是,在我的64位Win7开发系统上,安装程序写入到非Wow6432Node和应用程序从读取非Wow6432Node(成功)在客户端的64位Win7系统上,32位安装程序写入非非-Wow6432Node但32位应用程序从Wow6432Node中读取并失败。

下面是从注册表编辑器类的Wow6432Node和非哇部分观点对我的Win7开发系统

SOFTWARE\Wow6432Node\Classes

SOFTWARE\Classes

更新2017年8月4日,我有客户端手动创建在Wow6432Node部分使用regedit键入项来尝试并确认它是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 
+0

请注意,这比您意识到的要复杂得多。在Windows 7和更高版本中,Classes密钥是共享的,即没有单独的32位和64位视图。在早期版本中,[反映](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384235(v = vs.85).aspx)。另请参见[受WOW64影响的注册表项](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384253(v = vs.85).aspx)。所以你的机器表现得像预期的那样,但客户端机器却没有。 –

+1

如果您能够重现问题或在客户机器上执行故障排除,则可从MS网站获得Process Monitor作为故障排除工具。我的第一个猜测是,这与它是一个VB6应用程序的事实有关,例如,Windows可能决定应用一些破坏事物的兼容性修补程序。 (或者,兼容性修补程序可能在您的开发机器上已经存在,并且是它可以正常工作的唯一原因。) –

+0

尝试使用RegQueryReflectionKey()来确定两台不同机器上的反射是否存在差异。 – thx1138v2

事实证明,这是不相关的WOW64在所有但由特定客户引起了不在尝试读取密钥时具有对注册表项和请求“完全访问”的代码的写入权限。未扩展的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)