GetSubKeyNames 函数在 C# 和 Visual Basic 中返回不同的子键

Posted

技术标签:

【中文标题】GetSubKeyNames 函数在 C# 和 Visual Basic 中返回不同的子键【英文标题】:GetSubKeyNames function return diffrent subkeys in C# and Visual Basic 【发布时间】:2012-11-14 07:46:09 【问题描述】:

我正在使用 GetSubKeysNames 函数从 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 获取子项。但它返回不同的子键计数。在 C# 中返回 371 个子键,在 Visual Basic 中返回 61 个子键。我哪里错了?

这是一些代码和图片。

C#

string[] deneme = unistallKey.GetSubKeyNames();

VB

Dim deneme() As String = UninstallKey.GetSubKeyNames

【问题讨论】:

看看这个:***.com/questions/3112181/… 什么是UninstallKey?您应该将代码发布在您获得子密钥的位置而不是您使用它们的位置。 Unistallkey 是 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall,我想获取 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 的子项。我没有使用,我正在尝试在这里获取它们。 【参考方案1】:

我也遇到了同样的问题,使用下面的代码,问题就解决了。

 Dim rk1 As RegistryKey = Microsoft.Win32.RegistryKey.OpenBaseKey _
                                    (Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64)
        Dim rk2 As RegistryKey = Microsoft.Win32.RegistryKey.OpenBaseKey _
                                    (Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64)
        Dim rk3 As RegistryKey = Microsoft.Win32.RegistryKey.OpenBaseKey _
                                    (Microsoft.Win32.RegistryHive.LocalMachine, Microsoft.Win32.RegistryView.Registry64)

    rk1 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)

    regpath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

    rk2 = rk1.OpenSubKey(regpath)

    For Each subk As String In rk2.GetSubKeyNames

        rk3 = rk2.OpenSubKey(subk, False)

        value = rk3.GetValue("DisplayName", "")

        If value <> "" Then
            includes = True
            If value.IndexOf("Hotfix") <> -1 Then includes = False
            If value.IndexOf("Security Update") <> -1 Then includes = False
            If value.IndexOf("Update for") <> -1 Then includes = False
            If value.IndexOf("Service Pack") <> -1 Then includes = False

            For vAtual = 0 To UBound(Softwares)
                If value = Softwares(vAtual) Then
                    includes = False
                End If
            Next

            If includes = True Then
                gridSoft.Rows.Add(value, rk3.GetValue("InstallDate", ""), rk3.GetValue("UninstallString", ""), rk3.GetValue("EstimatedSize", ""), rk3.GetValue("InstallLocation", ""), rk3.GetValue("Publisher", ""))
                Softwares(vCont) = value
                vCont = vCont + 1
            End If

        End If
    Next

【讨论】:

【参考方案2】:

可能您的某些程序安装在 32 位以下,而有些则安装在 64 位以下。 通过以下键枚举:

HKEY_LOCAL_MACHINE\Software\WOW6432node\

【讨论】:

我正在检查它们,但问题出在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 下

以上是关于GetSubKeyNames 函数在 C# 和 Visual Basic 中返回不同的子键的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中处理纯虚函数调用

从 C# 调用时,来自 SQL Server 的标量值函数不返回值

C# Dictionary 函数解析及使用方法

使用 List 和 Stack 在 C# 中实现深度优先搜索

C#怎么调用sqlserver的自定义函数

C#多线程之旅