Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » System

Lesen und Schreiben von Windows-Registry-Schlüsseln

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.AdministratorSebastian 15.09.2010

Im Folgenden zwei einfache Funktionen zum Lesen und Schreiben von Registry-Werten (Windows-Registrierung). Die Wertetypen DWORD, STRING und BINARY können gelesen, STRING und DWORD zudem geschrieben werden.

Der Code wurde ursprünglich im Externer Link!internationalen FreeBASIC-Forum von Externer Link!vdecampo mit englischen Kommentaren zur Verfügung gestellt. Die Quelltexte können nach Belieben verwendet, erweitert und verbessert werden ("Feel free to use, expand, or improve").

'
'   Einfache Funktionen zum Lesen/Schreiben von Windows-Registry-Schluesseln
'   Code von VB6 auf FB portiert von Vincent DeCampo (2010)
'   Urspruenglicher Autor nicht bekannt.
'
'   Quelle:
'      http://www.freebasic.net/forum/viewtopic.php?t=16455
'

#Include "windows.bi"
#Include "vbcompat.bi"

' Moegliche Registry-Datentypen
Enum InTypes
   ValNull = 0
   ValString = 1
   ValXString = 2
   ValBinary = 3
   ValDWord = 4
   ValLink = 6
   ValMultiString = 7
   ValResList = 8
End Enum

' Definitionen der Registry-Sektionen
'Const HKEY_CLASSES_ROOT = &H80000000
'Const HKEY_CURRENT_USER = &H80000001
'Const HKEY_LOCAL_MACHINE = &H80000002
'Const HKEY_USERS = &H80000003
'Const HKEY_PERFORMANCE_DATA = &H80000004
'Const HKEY_CURRENT_CONFIG = &H80000005


' **** Schluessel lesen ****

Function ReadRegistry(Byval Group As HKEY, Byval Section As LPCSTR, _
        Byval Key As LPCSTR) As String

    Dim As DWORD lDataTypeValue, lValueLength
    Dim As String*2048 sValue
    Dim As String Tstr1, Tstr2
    Dim As HKEY lKeyValue
    Dim As Integer lResult
    Dim As Double td

    sValue = ""
    lResult      = RegOpenKey(Group, Section, @lKeyValue)
    lValueLength = Len(sValue)
    lResult      = RegQueryValueEx(lKeyValue, Key, 0&, @lDataTypeValue, _
                        Cast(Byte Ptr,@sValue), @lValueLength)

    If (lResult = 0) Then
      Select Case lDataTypeValue
         Case REG_DWORD
            td = Asc(Mid(sValue, 1, 1)) + &H100& * Asc(Mid(sValue, 2, 1)) + &H10000 * _
                 Asc(Mid(sValue, 3, 1)) + &H1000000 * Cdbl(Asc(Mid(sValue, 4, 1)))
            sValue = Format(td, "000")
         Case REG_BINARY
            ' Binaerdaten als Hexadezimalstring zurueckgeben (2 Zeichen pro Byte)
            Tstr2 = ""
            For I As Integer = 1 To lValueLength
               Tstr1 = Hex(Asc(Mid(sValue, I, 1)))
               If Len(Tstr1) = 1 Then Tstr1 = "0" & Tstr1
               Tstr2 += Tstr1
            Next
            sValue = Tstr2
         Case Else
            sValue = Left(sValue, lValueLength - 1)
      End Select
    End If

    lResult = RegCloseKey(lKeyValue)
    Return sValue

End Function



' **** Schluessel schreiben ****

Sub WriteRegistry (Byval Group As HKEY, Byval Section As LPCSTR, Byval Key As LPCSTR, _
        Byval ValType As InTypes, value As String)

    Dim lResult As Integer
    Dim lKeyValue As HKEY
    Dim lNewVal As DWORD
    Dim sNewVal As String * 2048

    lResult = RegCreateKey(Group, Section, @lKeyValue)

    If ValType = ValDWord Then
      lNewVal = CUInt(value)
      lResult = RegSetValueEx(lKeyValue, Key, 0&, ValType, _
                    Cast(Byte Ptr,@lNewVal), SizeOf(DWORD))
    Else
      If ValType = ValString Then
         sNewVal = value & Chr(0)
         lResult = RegSetValueEx(lKeyValue, Key, 0&, ValString, _
                    Cast(Byte Ptr,@sNewVal), Len(sNewVal))
      Endif
    End If

    lResult = RegFlushKey(lKeyValue)
    lResult = RegCloseKey(lKeyValue)

End Sub

Verwendungsbeispiel

Fügen Sie den folgenden Beispielcode ans Ende des Programms oben an, um die Funktionen zu testen.

Hinweis: Standardmäßig beendet sich das Programm (durch BefehlsreferenzeintragEND), bevor mit WriteRegistry ein Wert in Ihre Windows-Registry geschrieben wird, d.h. der Code führt in folgender Form keine Änderungen an der Registry durch (nur Lese-Zugriff).

Dim regpath As String
Dim keyname As String

' **** Einen Schluessel lesen ****

regpath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
keyname = "ProductName"
Print keyname & "=" & ReadRegistry(HKEY_LOCAL_MACHINE,regpath,keyname)
' Ausgabe zum Beispiel:
'    ProductName=Microsoft Windows XP

Print "Fertig. Beliebige Taste druecken."

Sleep    ' Auf Tastendruck warten

End      ' Programm beenden. Wenn diese Zeile entfernt wird, wird im
         ' Folgenden ein Schluessel angelegt/geschrieben!
         ' Vorsicht: Bearbeitung der Registry!

' **** Einen Schluessel schreiben ****

regpath = "SOFTWARE\MeineSoftwareFirma"
keyname = "MeinEintrag"

WriteRegistry (HKEY_CURRENT_USER,regpath, keyname, ValDword, "25")

Print "Fertig. Zum Beenden beliebige Taste druecken."
Sleep
End


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 15.09.2010 von AdministratorSebastian angelegt.
  • Die aktuellste Version wurde am 15.09.2010 von AdministratorSebastian gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen