Probleme mit RegQueryValueEx

Hallo
Wer kann mir weiter Helfen?
Was mache ich falsch bei diesem Befehl. Besten Dank für jeden Hinweis.
Grüsse Sebastian

Public Sub RegistrySetupUnregistered()
'Deklaration: Lokale Prozedur-Variablen
Dim lngKey As Long
Dim lngResult As Long
Const strAppName = „SRA Soft\KeyX“
'Generiert den neuen Eintrag
lngResult = RegCreateKey(HKEY_LOCAL_MACHINE, „Software\SRA Soft\NHK Daten 06.01.00“, lngKey)
lngResult = RegCloseKey(lngKey)
Dim hKey, s
Dim KeyWert, KeyName As String
KeyWert = „abcdefg“
KeyName = „Unterschlüssel“
lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, „Software\SRA Soft\NHK Daten 06.01.00“, 0, KEY_ALL_ACCESS, hKey)
lngResult = RegSetValueEx(hKey, KeyName, 0, REG_SZ, ByVal KeyWert, Len(KeyWert))
lngResult = RegCloseKey(hKey)

'neuen Eintrag einlesen
lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, „Software\SRA Soft\NHK Daten 06.01.00“, 0, KEY_QUERY_VALUE, hKey)

'Problemstelle *******************************************************
lngResult = RegQueryValueEx(hKey, „Unterschlüssel“, 0, REG_SZ, ByVal s, Len(s))
'*********************************************************************

lngResult = RegCloseKey(hKey)
End Sub

'Deklarationen der Funktionen
'RegKey Funktion
Public Declare Function RegQueryValueEx Lib „advapi32.dll“ Alias „RegQueryValueExA“ (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Any) As Long
Public 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
Public Declare Function RegCloseKey Lib „advapi32.dll“ (ByVal hKey As Long) As Long
Declare Function RegSetValueEx Lib „advapi32.dll“ _
Alias „RegSetValueExA“ ( _
ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal Reserved As Long, _
ByVal dwType As Long, _
lpData As String, _
ByVal cbData As Long) As Long
Public Declare Function RegCreateKeyEx Lib „advapi32.dll“ _
Alias „RegCreateKeyExA“ ( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal Reserved As Long, _
ByVal lpClass As String, _
ByVal dwOptions As Long, _
ByVal samDesired As Long, _
ByVal lpSecurityAttributes As Any, _
phkResult As Long, _
lpdwDisposition As Long) As Long
Public Const REG_OPTION_NON_VOLATILE As Long = &H0&
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Declare Function RegDeleteKey Lib „advapi32.dll“ _
Alias „RegDeleteKeyA“ ( _
ByVal hKey As Long, _
ByVal lpSubKey As String) As Long
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4
Public Const KEY_ENUMERATE_SUB_KEYS = &H8
Public Const KEY_NOTIFY = &H10
Public Const KEY_CREATE_LINK = &H20
Public Const KEY_ALL_ACCESS = KEY_QUERY_VALUE Or KEY_SET_VALUE _
Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or _
KEY_NOTIFY Or KEY_CREATE_LINK

Public Const KEY_READ = KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS _
Or KEY_NOTIFY
Public Const KEY_WRITE = KEY_SET_VALUE Or KEY_CREATE_SUB_KEY
Public Const KEY_EXECUTE = KEY_READ

Public Const ERROR_SUCCESS = 0&

Public Const REG_NONE = 0
Public Const REG_SZ = 1

Public Const root = HKEY_LOCAL_MACHINE

Public Declare Function RegCreateKey Lib „advapi32.dll“ Alias _
„RegCreateKeyA“ (ByVal hKey As Long, ByVal lpSubKey As _
String, phkResult As Long) As Long

Declare Function RegSetValue Lib „advapi32.dll“ _
Alias „RegSetValueA“ ( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal dwType As Long, _
ByVal lpData As String, _
ByVal cbData As Long) As Long

Hallo,

unter VB sollte die RegQueryValueEx-Funktion für jeden erforderlichen Datentyp seperat deklariert werden:

’ RegQueryValueEX _
Um Typsicherheit zu erlangen, wird die Funktion RegQueryValueEX _
in vier verschiedenen Varianten deklariert (String, Long, Byte, NULL)
Private Declare Function RegQueryValueExString _
Lib „advapi32.dll“ Alias „RegQueryValueExA“ _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
ByVal lpData As String, _
lpcbData As Long) _
As Long

Private Declare Function RegQueryValueExLong _
Lib „advapi32.dll“ Alias „RegQueryValueExA“ _
(ByVal hKey As Long, _
ByVal lpValueName As String, _
ByVal lpReserved As Long, _
lpType As Long, _
lpData As Long, _
lpcbData As Long) _
As Long

usw…

Public Sub RegistrySetupUnregistered()
'Deklaration: Lokale Prozedur-Variablen
Dim lngKey As Long
Dim lngResult As Long
Const strAppName = „SRA Soft\KeyX“
'Generiert den neuen Eintrag
lngResult = RegCreateKey(HKEY_LOCAL_MACHINE, „Software\SRA
Soft\NHK Daten 06.01.00“, lngKey)
lngResult = RegCloseKey(lngKey)
Dim hKey, s
Dim KeyWert, KeyName As String
KeyWert = „abcdefg“
KeyName = „Unterschlüssel“
lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, „Software\SRA
Soft\NHK Daten 06.01.00“, 0, KEY_ALL_ACCESS, hKey)
lngResult = RegSetValueEx(hKey, KeyName, 0, REG_SZ, ByVal
KeyWert, Len(KeyWert))
lngResult = RegCloseKey(hKey)

'neuen Eintrag einlesen
lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, „Software\SRA
Soft\NHK Daten 06.01.00“, 0, KEY_QUERY_VALUE, hKey)

'Problemstelle
*******************************************************
lngResult = RegQueryValueEx(hKey, „Unterschlüssel“, 0, REG_SZ,
ByVal s, Len(s))
'*********************************************************************

Die Variable s ist hier vom Typ Variant und leer, das heisst Len(s) ergibt praktisch die Länge 0 für die Anzahl der einzulesenden Zeichen. RegQueryValueEx erwartet an dieser Stelle die maximale Abzahl an einzulesenden Zeichen. Bei Null wird eben nichts eingelesen und somit auch nichts geliefert…
Bei Long, Byte und Null geht das so, da hier die Variablengröße fest ist. Variant und String sind variabel und sollten vorher reserviert werden:

Wert = Space$(64)
Name = Space$(256)
lRet = RegQueryValueExString(hOpen2, „Description“, n, n, Name, 256)
lRet = RegQueryValueExString(hOpen2, „PortName“, n, n, Wert, 64)

Das funktioniert bei mir ganz gut.

Schöne Grüße,
Thomas