\ Beispiel zum Lesen von Werten aus der Windows Registry.
\ Samstag, März 23 2013
\ Dirk Busch

anew RegistryDemo.f

\ Einen Registry-Schlüssel zum lesen öffnen.
: RegistryOpenKey ( hKey lpSubKey lpValueName -- lpValueName hOpenKey )
  -rot \ lpValueName hKey lpSubKey
  KEY_READ (RegOpenKey)
;

\ einen mit RegistryOpenKey geöffneten Registry-Schlüssel schließen.
: RegistryCloseKey ( hOpenKey -- )
  (RegCloseKey) drop
;

\ Ließt einen Eintrag aus der Registry aus, und liefert
\ die Adresse des Rückgabebuffers, die Länge der Daten im Rückgabebuffer, sowie
\ den Datentyp des Registry-Eintrags zurück.
1024 constant REGBUFFERSIZE
create RegValue REGBUFFERSIZE allot
variable ValueType
variable ValueSize

: RegistryGetValue ( hKey lpSubKey lpValueName - Addr Size Type true | false )

  0 RegValue !
  0 ValueType !
  REGBUFFERSIZE ValueSize !

  \ 1. Schritt: den Registry-Schlüssel öffnen
  \ http://msdn.microsoft.com/en-us/library/windows/desktop/ms724897(v=vs.85).aspx
  RegistryOpenKey dup INVALID_HANDLE_VALUE <> \ lpValueName hOpenkey
  if
    \ 2. Schritt: die Daten des Registry-Eintrags auslesen
    \ http://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx
    dup >r swap \ hOpenkey lpValueName
    ValueType RegValue ValueSize
    (RegQueryValue) \ flag

    \ 3. Schritt: den Registry-Schlüssel schließen
    \ http://msdn.microsoft.com/en-us/library/windows/desktop/ms724837(v=vs.85).aspx
    r> RegistryCloseKey

    \ 4. Schritt: bei Erfolg, die Daten und ein True-Flag zurückliefern oder
    \ ein False-Flag im Fehlerfall
    if RegValue ValueSize @ ValueType @ true
    else false
    then
  else
    drop drop false
  then
;

\ debug RegistryGetValue

: .REG_SZ ( Addr Size Type -- true | Addr Size Type false )
  dup REG_SZ =
  if drop type false else true then
;

: .REG_DWORD ( Addr Size Type -- true | Addr Size Type false )
  dup REG_DWORD =
  if drop drop @ . false else true then
;

: .REG_OTHER ( Addr Size Type -- )
  drop dump
;

: RegistryGetValueTest ( hKey lpSubKey lpValueName -- )

  RegistryGetValue \ Addr Size Type true | false
  if  cr ." RegistryGetValue: "
      ." TYPE = " dup .
      ." SIZE = " >r dup . r>
      ." DATA = "

      .REG_SZ
      if .REG_DWORD
        if .REG_OTHER
        then
      then
  else  cr ." RegistryGetValue: ERROR"
  then
;

cls

HKEY_LOCAL_MACHINE
z" Software\Microsoft\Notepad\DefaultFonts"
z" lfFaceName"
RegistryGetValueTest

HKEY_LOCAL_MACHINE
z" Software\Microsoft\Notepad\DefaultFonts"
z" iPointSize"
RegistryGetValueTest

HKEY_LOCAL_MACHINE
z" Software\Microsoft\Windows\CurrentVersion"
z" ProgramFilesPath"
RegistryGetValueTest


HKEY_LOCAL_MACHINE
z" HARDWARE\DEVICEMAP\SERIALCOMM_"
z" \Device\VCP0"
RegistryGetValueTest

HKEY_LOCAL_MACHINE
z" HARDWARE\DEVICEMAP\SERIALCOMM"
z" \Device\VCP0_"
RegistryGetValueTest
\s
dies Sollte sowas in der Art ausgeben:

RegistryGetValue: TYPE = 1 SIZE = 15 DATA = Lucida Console
RegistryGetValue: TYPE = 4 SIZE = 4 DATA = 100
RegistryGetValue: TYPE = 2 SIZE = 16 DATA =
  440CE8 | 25 50 72 6F 67 72 61 6D  46 69 6C 65 73 25 00 00 |%ProgramFiles%..|
RegistryGetValue: ERROR ok

