为什么RegOpenKey()在64位Win7

时间:2017-08-03 23:33:19

标签: windows-7 vb6 wow64

我已经阅读了这个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"。客户端也安装在运行XP的32位计算机上,它在那里工作正常。我知道必须发生的事情是应用程序要求从非Wow6432Node 读取而不在那里找到密钥,因为密钥被重定向到 Wow6432Node

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

因为当客户在非Wow6432Node 注册表项中使用 Regedit 查看时,他们会找到预期的密钥,但他们无法在找到它Wow6432Node 位置。我不明白的是,如果应用程序和安装程序都是32位程序,为什么它们都不会从 Wow6432Node 写入和读取?如果我们运行相同的安装程序并且都安装了64位Windows,为什么它在我的开发计算机上表现一种方式而在客户端上表现不同?

我已经阅读了这个link,但我读到的内容似乎与我观察到的32位应用程序重定向相匹配。从我在链接中看到的内容看来,32位安装程序和我的32位应用程序应该正在读取并将其注册表项写入 Wow6432Node 。但我观察到的是,在我的64位Win7开发系统上,安装程序写入非Wow6432Node ,应用程序读取非Wow6432Node (成功)在客户端& #39; 64位Win7系统,32位安装程序写入非Wow6432Node ,但32位应用程序从 Wow6432Node 读取并失败。

以下是Win7开发系统中Wow6432Node和Non-Wow部分的Regedit of Classes的视图

SOFTWARE\Wow6432Node\Classes

SOFTWARE\Classes

更新8-4-2017我让客户端在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

1 个答案:

答案 0 :(得分:2)

事实证明,这与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)