Southmountain Ответов: 3

Почему эта функция возвращает пустую строку в VB.NET-что?


Я тестирую способ, представленный в этом ссылка^.

Я быстро создал приложение Windows Form с одной кнопкой и четырьмя метками. для отображения UUID Windows и UUID машины используются две метки.

Оказывается, этот вызов возвращает пустую строку:

Dim readValue = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", "MachineGUID", Nothing)


Что я уже пробовал:

вот мой фрагмент кода в VB.NET для вашей быстрой справки:
Imports System.Management
Imports Microsoft.Win32

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label2.Text = Get_WinGUID()
        Label4.Text = Get_PC_UUID()

    End Sub

    Public Function Get_WinGUID() As String
        Dim sRet As String = ""
        Try
            Dim readValue = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography", "MachineGUID", Nothing)
            sRet = readValue
        Catch ex As Exception
            sRet = ""
        End Try

        Return sRet
    End Function

    Public Function Get_PC_UUID() As String
        Dim UUID As String = ""
        Try
            Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_ComputerSystemProduct")

            For Each queryObj As ManagementObject In searcher.Get()
                UUID += queryObj("UUID")
            Next

        Catch err As ManagementException
        End Try
        Return UUID
    End Function

End Class

Richard MacCutchan

Посмотрите в своем реестре, чтобы увидеть, присутствует ли этот ключ и значение.

Southmountain

но я использовал редактор реестра, чтобы просмотреть этот элемент((MachineGUID)), там есть значение. это не должна быть пустая строка.

3 Ответов

Рейтинг:
21

Dave Kreskowiak

Это происходит потому, что ваше приложение работает в 64-разрядной системе Windows, и вы пытаетесь прочитать значение из 64-разрядного реестра, но ваше приложение работает как 32-разрядное приложение.

Дважды щелкните "мой проект" в обозревателе решений и перейдите на вкладку компиляция. В разделе "целевой процессор" вы увидите AnyCPU с флажком "предпочесть 32-разрядный", который установлен под ним. Снимите этот флажок, перекомпилируйте приложение и запустите его.

Этот флажок сообщает среде выполнения, что если она работает на 64-разрядной машине, то все равно запустите приложение как 32-разрядное.


Southmountain

вы правы насчет моих текущих настроек. Я построил свое приложение, ориентированное на x86, и все равно получаю пустую строку...

Dave Kreskowiak

Это потому, что x86 означает "только 32-разрядный", и вы не можете прочитать 64-разрядный реестр из 32-разрядного приложения.

Значение, которое вы пытаетесь прочитать, существует только на 64-разрядной стороне реестра.

Southmountain

Большое спасибо! Теперь я понял...

Рейтинг:
15

Richard Deeming

Как уже говорилось в предыдущих решениях, это происходит потому, что вы запускаете 32-разрядный процесс на 64-разрядной ОС. Вас укусил "редиректор реестра" - ключи, видимые в regedit не будет совпадать с ключами, видимыми для вашего кода.

Реестр переадресации - Win32-приложений, Майкрософт документы[^]

Если вы не можете изменить свое приложение для запуска в качестве 64-разрядного приложения, вам нужно будет открыть ключ с помощью определенного ключа. RegistryView:

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography"))
{
   // key now points to the 64-bit key
}
c# - OpenSubKey() возвращает null для раздела реестра, который я вижу в regedit.exe - переполнение стека[^]


Southmountain

Большое спасибо! теперь я понял.

Рейтинг:
1

Leo Chapiro

Как Ричард Маккатчан[^] уже упоминалось, что такое поведение не обязательно является ошибкой!
Взгляните на это Метод Registry.GetValue(String, String, Object) :

Извлекает значение, связанное с указанным именем, в указанном разделе реестра. Если имя не найдено в указанном ключе, возвращает указанное вами значение по умолчанию или null, если указанный ключ не существует.

Когда вы устанавливаете значение по умолчанию "ничего", вы получаете обратно пустую строку.


Southmountain

но я использовал редактор реестра, чтобы просмотреть этот элемент, там есть значение. это не должна быть пустая строка.