Vb.net 如何查找注册表项?32/64位

Vb.net 如何查找注册表项?32/64位,vb.net,visual-studio,registry,visual-studio-2013,32bit-64bit,Vb.net,Visual Studio,Registry,Visual Studio 2013,32bit 64bit,如何查找注册表项?我需要从具有3个不同GUID的32位和64位系统进行查看。我需要将它在InstallLocation中找到的那个返回到文本框中。我已经编写了以下代码。但我不知道它是否真的有用。我是这方面的初学者。请帮忙 Imports Microsoft.Win32 Imports System.Net Imports System Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs)

如何查找注册表项?我需要从具有3个不同GUID的32位和64位系统进行查看。我需要将它在InstallLocation中找到的那个返回到文本框中。我已经编写了以下代码。但我不知道它是否真的有用。我是这方面的初学者。请帮忙

Imports Microsoft.Win32
Imports System.Net
Imports System

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Is64Bit As Boolean

        Is64Bit = String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))

        If Not Is64Bit Then
            Try
                Dim rk32_1 As RegistryKey
                rk32_1 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812EU}_is1")
                Dim il_rk32_1 As String = rk32_1.GetValue("InstallLocation").ToString

            Catch ex As Exception

            End Try
            Try
                Dim rk32_2 As RegistryKey
                rk32_2 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812NA}_is1")
                Dim il_rk32_2 As String = rk32_2.GetValue("InstallLocation").ToString

            Catch ex As Exception

            End Try
            Try
                Dim rk32_3 As RegistryKey
                rk32_3 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1")
                Dim il_rk32_3 As String = rk32_3.GetValue("InstallLocation").ToString

            Catch ex As Exception

            End Try
        End If

        If Is64Bit Then
            Try
                Dim rk64_1 As RegistryKey
                rk64_1 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812EU}_is1")
                Dim il_rk64_1 As String = rk64_1.GetValue("InstallLocation").ToString

            Catch ex As Exception

            End Try
            Try
                Dim rk64_2 As RegistryKey
                rk64_2 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812NA}_is1")
                Dim il_rk64_2 As String = rk64_2.GetValue("InstallLocation").ToString

            Catch ex As Exception

            End Try
            Try
                Dim rk64_3 As RegistryKey
                rk64_3 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1")
                Dim il_rk64_3 As String = rk64_3.GetValue("InstallLocation").ToString

            Catch ex As Exception

            End Try
        End If

    End Sub

End Class

我没有看太多你的代码,因为你做了相反的检查。Wow64是指64位机器上的32位应用程序

发件人:

WoW64(Windows 64位上的Windows 32位)

WoW64子系统还处理运行32位的其他关键方面 应用。它涉及管理32位的交互 具有Windows组件(如注册表)的应用程序 具有64位和32位应用程序的不同密钥。例如 HKEY_LOCAL_MACHINE\Software\WOW6432节点是与 HKEY_本地_机器\软件(尽管32位应用程序不是 注意此重定向)。有些注册表项是从64位映射的 它们的32位等价物,而其他的则有它们的内容 镜像,具体取决于Windows的版本

PS:请注意,
System32
SysWOW64
windows目录也会发生同样的情况

更新:

这是一种检索操作系统是否为x64的简单方法(而不是获取环境变量
PROCESSOR\u architecew6432
,这可能在x86操作系统中伪造):

获取操作系统体系结构 "(Elektro) ' '用法示例: 'Dim OSArchitecture As Architecture=GetOSArchitecture() 'MsgBox(OSArchitecture.ToString) ' ''' ''确定操作系统是32位还是64位。 ''' ''' ''返回值可以是: 32位操作系统(x86)的“32” ''''64'用于64位操作系统(x64) ''' 私有函数GetOSArchitecture()作为体系结构 返回[Enum].Parse(GetType(架构), Runtime.InteropServices.Marshal.SizeOf(GetType(IntPtr))*8) 端函数 ''' ''表示可能的处理器架构。 ''' 作为整数的私有枚举体系结构 ''' ''32位 ''' x86=32 ''' ''64位 ''' x64=64 结束枚举
首先,请记住,如果程序编译为x86,则
(IntPtr.Size*8)
将始终返回
32
(如果这是一个问题,我确实有一个类可以获取操作系统版本,无论exe如何编译)

我建议使用以下方法:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    ' Check if the OS is 64 bit
    Dim Is64Bit As Boolean = ((IntPtr.Size * 8) = 64)

    Dim UninstallPath As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"

    If Is64Bit Then
        UninstallPath = UninstallPath.Insert(8, "\Wow6432Node")
    End If

    Dim il_rk32_1 As String = Nothing
    Dim il_rk32_2 As String = Nothing
    Dim il_rk32_3 As String = Nothing

    Try
        Dim rk32_1 As RegistryKey = Registry.LocalMachine.OpenSubKey(UninstallPath & "{1EAC1D02-C6AC-4FA6-9A44-96258C37C812EU}_is1")

        If rk32_1 IsNot Nothing Then
            Dim Val As Object = rk32_1.GetValue("InstallLocation")

            If Val IsNot Nothing Then
                il_rk32_1 = Val.ToString
            End If
        End If

    Catch ex As Exception

    End Try

    If String.IsNullOrEmpty(il_rk32_1) Then
        il_rk32_1 = "C:\Games\World_of_Tanks\"
    End If

    Me.TextBox1.Text = il_rk32_1


    Try
        Dim rk32_2 As RegistryKey = Registry.LocalMachine.OpenSubKey(UninstallPath & "{1EAC1D02-C6AC-4FA6-9A44-96258C37C812NA}_is1")

        If rk32_2 IsNot Nothing Then
            Dim Val As Object = rk32_2.GetValue("InstallLocation")

            If Val IsNot Nothing Then
                il_rk32_2 = Val.ToString
            End If
        End If

    Catch ex As Exception

    End Try

    If String.IsNullOrEmpty(il_rk32_2) Then
        il_rk32_2 = "C:\Games\World_of_Tanks\"
    End If

    Me.TextBox2.Text = il_rk32_2


    Try
        Dim rk32_3 As RegistryKey = Registry.LocalMachine.OpenSubKey(UninstallPath & "{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1")

        If rk32_3 IsNot Nothing Then
            Dim Val As Object = rk32_3.GetValue("InstallLocation")

            If Val IsNot Nothing Then
                il_rk32_3 = Val.ToString
            End If
        End If

    Catch ex As Exception

    End Try

    If String.IsNullOrEmpty(il_rk32_3) Then
        il_rk32_3 = "C:\Games\World_of_Tanks\"
    End If

    Me.TextBox3.Text = il_rk32_3

End Sub
编辑:


我已经更改了上面的代码来回答OP的问题(在评论中)

为了访问从.reg文件安装的应用程序配置,我必须编写以下函数:

Public Const RegRoot As String = "Software\MyApp\"

Function ReadFromRegister(ByRef FieldToRead As String) As String
    ReadFromRegister = ""
    Dim MyReg As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    If MyReg Is Nothing Then
        End
    End If

    Dim MySubReg As RegistryKey = MyReg.OpenSubKey(RegRoot)
    If MySubReg Is Nothing Then
        End
    End If

    ReadFromRegister = MySubReg.GetValue(FieldToRead)
    MySubReg.Close()
    MyReg.Close()

End Function

请注意,函数
OpenBaseKey
是从上的framework4引入的。

是这样的:
如果GetOSArchitecture()=(“32”),那么
如果
如果GetOSArchitecture()=(“64”)结束然后
结束如果
否,它不是字符串类型,ir返回一个整数。我已经详细阐述了代码,这方面的一个例子可能是:
Dim OSArchitecture As Architecture=GetOSArchitecture():如果OSArchitecture=Architecture.x86那么:ElseIf OSArchitecture=Architecture.x64那么:如果
I编译所有EXE时使用:“Any CPU”@jyrka2这很好,然而,有时可能需要将其编译为
x86
(与COM相关),因此最好记住这一点。我不是说将注册表中的值设置为“C:\Games\World\u of_Tanks\”,但如果从注册表中找不到InstallLocation,它会将该值放在文本框中。感谢您的帮助:)永远不要直接访问WOW6432节点项
Public Const RegRoot As String = "Software\MyApp\"

Function ReadFromRegister(ByRef FieldToRead As String) As String
    ReadFromRegister = ""
    Dim MyReg As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    If MyReg Is Nothing Then
        End
    End If

    Dim MySubReg As RegistryKey = MyReg.OpenSubKey(RegRoot)
    If MySubReg Is Nothing Then
        End
    End If

    ReadFromRegister = MySubReg.GetValue(FieldToRead)
    MySubReg.Close()
    MyReg.Close()

End Function