2 Fragen zum Thema Registry

Justus

Mitglied
Ich habe 2 Fragen zum Thema Regisry

1. Wie kann ich alle Schlüssel eines "Ordners" in der Registry auslesen, bzw
alle Unterordner von HKEY_LOCAL_MACHINE\Software\

2.Wie kann ich änderungen von Einstellungen in der Registry übernehmen, ohne neu zu starten, z.B wenn ich das anzeigen des Fensterinhaltes während des verschiebens unterbinde soll kein neustart nötig sein, das die änderungen in kraft treten ?

Danke im Vorraus

Justus
 
Justus hat gesagt.:
Ich habe 2 Fragen zum Thema Regisry

1. Wie kann ich alle Schlüssel eines "Ordners" in der Registry auslesen, bzw
alle Unterordner von HKEY_LOCAL_MACHINE\Software\

2.Wie kann ich änderungen von Einstellungen in der Registry übernehmen, ohne neu zu starten, z.B wenn ich das anzeigen des Fensterinhaltes während des verschiebens unterbinde soll kein neustart nötig sein, das die änderungen in kraft treten ?

Danke im Vorraus

Justus

Zu 1) In c++ so:
//------Open The Key-----------
bOK = (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders", 0, KEY_READ, &hKey));

//------Read the Value---------
bOK = (ERROR_SUCCESS == RegQueryValueEx(hKey, "OriginCache", 0, 0, origKey, &size));

Hier Öffnet man zuerst den Key HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders

Und liest dann daraus den Eintrag OriginCache aus, der Wert steht dann in origKey

Zu 2) Wenn Du das herausgefunden hat, bitte bitte bitte bitte meld dich bei mir
 
Ich kann nur zur Frage 1 ein VB-Beispiel anbieten.

1. Wie kann ich alle Schlüssel eines "Ordners" in der Registry auslesen, bzw
alle Unterordner von HKEY_LOCAL_MACHINE\Software\

Hinweis zum Code:
Wenn du die Typelib win.tlb als Verweis hinzufügst, kannst du dir eine Menge Arbeit mit der Deklaration von Apis sparen. Die win.tlb befindet sich auf der Win98-CD und kann auch unter w2k bzw. XP verwendet werden.

Nun zum Source:
Füge folgenden Code in ein Standardmodul ein. Wenn du die win.tlb verwenden willst, kannst du die Direktive USEWINTLB auf 1 setzen. Ansonsten ist der Code auch ohne die win.tlb (USEWINTLB=0) lauffähig.

Der folgende Code liste alle Subknoten des Registry-Schlüssel HKEY_LOCAL_MACHINE\Software\ auf.

Code:
#Const USEWINTLB = 0

#If USEWINTLB = 0 Then
' Die Typelib win.tlb wird nicht verwendet.

Const ERROR_SUCCESS = 0
Const HKEY_LOCAL_MACHINE = &H80000002
Const KEY_ALL_ACCESS = &HF003F
Const ERROR_NO_MORE_ITEMS = &H103
Const cMaxPath = &H104

Type FILETIME
    dwHighDateTime As Long
    dwLowDateTime As Long
End Type

Declare Function RegOpenKeyEx Lib "advapi32.dll" _
    Alias "RegOpenKeyExA" ( _
    ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    ByVal ulOptions As Long, _
    ByVal samDesired As Long, _
    phkResult As Long) As Long

Declare Function RegCloseKey Lib "advapi32.dll" ( _
    ByVal hKey As Long) As Long

Declare Function RegEnumKeyEx Lib "advapi32.dll" _
    Alias "RegEnumKeyExA" ( _
    ByVal hKey As Long, _
    ByVal dwIndex As Long, _
    ByVal lpName As String, _
    lpcbName As Long, _
    ByVal lpReserved As Long, _
    ByVal lpClass As String, _
    lpcbClass As Long, _
    lpftLastWriteTime As Any) As Long

#End If

Sub main()
On Error GoTo Err_Exit
    Dim hKey&
    Dim SubKey$
    Dim hKeyResult&
    Dim NodeIndex&
    Dim Result&
    Dim lpName As String
    Dim lpcbName As Long
    Dim lpClass As String
    Dim lpcbClass As Long
    Dim lpftLastWriteTime As FILETIME

    hKey = HKEY_LOCAL_MACHINE
    SubKey = "Software"

    ' Registry-Knoten öffnen
    If ERROR_SUCCESS <> RegOpenKeyEx(hKey, SubKey, _
        0&, KEY_ALL_ACCESS, hKeyResult) Then
        Err.Raise Number:=vbObjectError, _
            Description:="Registry-Knoten konnte nicht geöffnet werden!"
    End If

    lpName = String(cMaxPath, 0)
    lpClass = String(cMaxPath, 0)
    NodeIndex = 0
    
    Do
        lpcbName = cMaxPath
        lpcbClass = cMaxPath
        
        Result = RegEnumKeyEx(hKeyResult, NodeIndex, lpName, lpcbName, 0&, _
            lpClass, lpcbClass, lpftLastWriteTime)
                    
        Select Case Result
            Case ERROR_NO_MORE_ITEMS
                ' Keine weiteren Subknoten vorhanden.
                Exit Do
            
            Case ERROR_SUCCESS
                NodeIndex = NodeIndex + 1
                ' Namen des Subknoten in den Debug-Screen ausgeben.
                Debug.Print Left$(lpName, lpcbName)
                
            Case Else
                Err.Raise Number:=vbObjectError, _
                    Description:="Fehler beim Auflisten der Registry-Knoten!"
        End Select
    Loop

    ' Registry-Knoten schließen
    If ERROR_SUCCESS <> RegCloseKey(hKeyResult) Then
        Err.Raise Number:=vbObjectError, _
            Description:="Registry-Knoten konnte nicht geschlossen werden!"
    End If

Sub_Exit:
    Exit Sub
Err_Exit:
    MsgBox Err.Description, vbInformation, "ERROR 0x" & Hex(Err.Number)
    Resume Sub_Exit
End Sub
 
Zurück