[VB2010] Registrywert aus "HKEY_CLASSES_ROOT" auslesen?

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Coder.

    [VB2010] Registrywert aus "HKEY_CLASSES_ROOT" auslesen?

    Ich würde gerne mit VB2010 einen Registrywert aus [HKEY_CLASSES_ROOT] auslesen. Allerdings bekomme ich das nicht hin, einen aus [HKEY_CURRENT_USER\Software\XYZ] bekomme ich aber problemlos. Ich habe es auch unter [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\XYZ] versucht, aber ebenso kein Erfolg.

    Hier mein Beispiel bei dem je nachdem ob ein bestimmter Wert vorhanden ist eine bestimmte MessageBox erscheinen und den Text einer Checkbox ersetzen:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Security.Permissions
    3. Imports Microsoft.Win32
    4. Public Class Main
    5. Private Sub Main_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. Dim Favoriten As String
    7. Favoriten = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder", "Attributes", True)
    8. CheckBox_Favoriten.Text = Favoriten
    9. If Favoriten = "a0900100" Then
    10. MsgBox("True (ON)")
    11. Else
    12. MsgBox("False (OFF)")
    13. End If
    14. End Sub
    15. End Class


    Das ganze soll nur ein kleines Beispiel sein mit dem ich mich herantasten möchte.
    Gibt es denn diesen Pfad wirklich ? Und warum importierst du Microsoft.Win32 wenn du dann doch den My-Namespace verwendest ? Ändere das ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Willkommen im Forum. :thumbup:

    Coder schrieb:

    aber ebenso kein Erfolg.
    Wie äußert sich das?
    1. Option Strict On
    2. VB.NET-Quellcode

      1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      2. Dim Favoriten As String
      3. Favoriten = My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder", "Attributes", True).ToString
      4. 'CheckBox_Favoriten.Text = Favoriten
      5. MessageBox.Show(Favoriten)
      6. 'If Favoriten = "a0900100" Then
      7. ' MsgBox("True (ON)")
      8. 'Else
      9. ' MsgBox("False (OFF)")
      10. 'End If
      11. End Sub

    Bei mir kommt:
    Bilder
    • Reg.png

      5,54 kB, 154×154, 568 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bekomme selbiges Ergebniss btw.
    Und dennoch, ersetze "My.Computer" bitte durch "Microsoft.Win32", bzw. nimms ganz weg da du diesen NameSpace importierst.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @Coder Mach mal

    VB.NET-Quellcode

    1. Dim value = -1601175296
    2. MessageBox.Show(value.ToString("X"))
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Willkommen im Forum.

    Danke! :)


    ThePlexian schrieb:

    Gibt es denn diesen Pfad wirklich ?

    Ja, definitiv.

    ThePlexian schrieb:

    Und warum importierst du Microsoft.Win32 wenn du dann doch den My-Namespace verwendest ? Ändere das ^^

    Ist noch ein Überrest aus älteren Versuchen.

    RodFromGermany schrieb:

    Wie äußert sich das?

    Alles unter [HKEY_CLASSES_ROOT] ist eigentlich unter [HKEY_LOCAL_MACHINE\SOFTWARE\Classes] und wird beim Start in ersterem bereitgestellt:
    HKEY_CLASSES_ROOT ist dynamisch und wird beim Start erstellt. Der Schlüssel HKEY_LOCAL_MACHINE\Software\Classes in den Arbeitsspeicher gelesen und als HKEY_CLASSES_ROOT zugänglich ist. Wenn Sie einen Schlüssel zum Bereich HKLM\Software\Classes hinzufügen, wird es sofort in HKCR repliziert.

    Quelle: Microsoft

    RodFromGermany schrieb:

    Bei mir kommt:

    Ups, stimmt, das kommt bei mir auch (unabhängig von Microsoft.Win32). Ich war gerade noch bei einem anderen Versuch. :huh:
    Allerdings ist der Wert "a0900100" (hex dword), "-1601175296" ist derselbe als Dez. DWORD.
    Die Ausgabe stimmt also schon. Müsste ich den Wert immer umrechnen oder gibt es da einen Trick? Wenn ich das in Regedit angezeigte "a0900100" mit dem Rechner in einen Dez. DWORD umrechne und ersetze funktioniert es einwandfrei. 8o

    Coder schrieb:

    gibt es da einen Trick?
    Sieh in der Registry nach, in welchem Format dieser Key vorliegt und passe Deinen Code entsprechend an.
    Bilder
    • Reg.png

      16,5 kB, 357×256, 192 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es ist wie bei dir ein DWORD und wird hexadezimal angezeigt (im Bild unten ist ein anderer Wert, der eine bestimmte Funktion deaktiviert). Was muss ich tun, dass VB den Wert als Hex-DWORD ausliest, also so wie er in Regedit standardmäßig angezeigt wird und auch in REG-Files exportiert wird?

    Wenn ich den Hex-DWORD "a0900100" im Win7-Rechner in einen Dez-DWORD umrechne kommt "-1601175296" heraus, wenn ich in Regedit auf "Dezimal" gehe spuckt dieser aber "2693792000" aus. Wie kommt das? Ich stehe da gerade auf dem Schlauch.
    Bilder
    • reg.png

      24,5 kB, 750×322, 241 mal angesehen

    Coder schrieb:

    Hex-DWORD
    gibt es nicht.
    DWORD ist ein 32 Bit unsigned Integer.
    Hex ist lediglich ein Spezialformat zur Erzeugung einer String-Repräsentation eines numerischen Ganzzahl-Ausdrucks, der dem Speicherinhalt des Wertes am nächsten kommt.
    Dieser Dein Wert als Integer ist -1601175296,
    dieser Dein Wert als unsigned Integer (UInteger) ist 2693792000,
    dieser Dein Wert in Hex-Darstellung ist "a0900100".
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die Erklärung! Muss ich den Wert immer umrechnen oder gibt es eine Möglichkeit in VB mit der Hex-Darstellung zu arbeiten?

    Eine andere Frage: Der von mit genannte Schlüssel HKEY_CLASSES_ROOT\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder hat normalerweise einen Schreibschutz den man normalerweise über Regedit aufheben muss. Kann man das auch mit VB machen? Mein Programm verlangt zum Start automatisch Adminrechte.

    EDIT: noch ein Problem: wenn ich das beim Clickereignis bei der Checkbox eintrage funktioniert es einwandfrei:

    VB.NET-Quellcode

    1. If CheckBox_Favoriten.Checked = True Then
    2. My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\GOG.com", "DefaultMD5", "ON")
    3. Else
    4. My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\GOG.com", "DefaultMD5", "OFF")
    5. End If

    Nehme ich aber einen DWORD-Wert von HKEY_CLASSES_ROOT\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder oder HKEY_CLASSES_ROOT\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder, also

    VB.NET-Quellcode

    1. My.Computer.Registry.SetValue("HKEY_CLASSES_ROOT\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder", "Attributes", "-1455423232")

    funktioniert das wiederum nicht. Woran kann das liegen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Coder“ ()

    Coder schrieb:

    Woran kann das liegen?
    Arbeite mit der .NET-Registry-Klasse Microsoft.Win32.Registry und nutze die Funktion Registry.SetValue() mit dem korrekten Wert für RegistryValueKind.
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So, es funktioniert alles soweit. :)

    Eine Frage hätte ich noch :

    Coder schrieb:

    Eine andere Frage: Der von mit genannte Schlüssel HKEY_CLASSES_ROOT\CLSID\{323CA680-C24D-4099-B94D-446DD2D7249E}\ShellFolder hat normalerweise einen Schreibschutz den man normalerweise über Regedit aufheben muss. Kann man das auch mit VB machen? Mein Programm verlangt zum Start automatisch Adminrechte.