Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

RegEnumValue liefert nur halbe Werte zurück

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Ryko



Anmeldungsdatum: 02.01.2013
Beiträge: 12

BeitragVerfasst am: 15.02.2013, 23:46    Titel: RegEnumValue liefert nur halbe Werte zurück Antworten mit Zitat

Hallo FreeBasic Community,
Ich habe ein paar Probleme mit der RegEnumValue Funktion die gibt nur die halben werte aus.
So sieht es in der Console aus:
https://www.dropbox.com/s/1cwen9x3brtpurt/consolebug.jpg

und so sollte es aussehen:
https://www.dropbox.com/s/vr167mdvoxcgle0/regedit.png
Die ersten drei Werte werden noch korrekt dargestellt, aber alles andere ist abgehackt.
Der Code den ich nutze:
Code:

Sub RegGetSubkeys(ByVal Hive As HKEY,ByVal sKey As String,sKeys() As String)
   
Dim hkey As HKEY,lResult As Long,dwKeys As DWORD,dwMaxLen As DWORD

lResult = RegOpenKeyEx(Hive,StrPtr(sKey),NULL,KEY_ALL_ACCESS,@hkey)

If lResult <> 0 Then
   
   Print "Error Opening RegistryKey"
   
   Else
      
      
      
      lResult = RegQueryInfoKey(hkey,NULL,NULL,NULL,@dwKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
      
      
      Dim sCurrentKey As ZString * 1096
      ReDim sKeys(0 To dwKeys)
      dwMaxLen = 1096
      For i As Integer = 0 To UBound(sKeys) -1
         
         lResult = RegEnumKeyEx(hkey,i,StrPtr(sCurrentKey),@dwMaxLen,NULL,NULL,NULL,NULL)
         
         Print sCurrentKey
         
      Next
      
   
EndIf
   
End Sub

Könnte es vielleicht daran liegen das der Buffer zu klein ist?
Ich hoffe ihr könnt mir da helfen.
Mfg Ryko
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 16.02.2013, 00:18    Titel: Antworten mit Zitat

Ich hab deinen Code schnell in einem kleinen Beispiel getestet und bei mir lief es einwandfrei auf meinem alten XP SP3, fbc 0.23
Code:
#Include "windows.bi"

Sub RegGetSubkeys(ByVal Hive As HKEY,ByVal sKey As String,sKeys() As String)
   Dim hkey As HKEY,lResult As Long,dwKeys As DWORD,dwMaxLen As DWORD
   lResult = RegOpenKeyEx(Hive,StrPtr(sKey),NULL,KEY_ALL_ACCESS,@hkey)

   If lResult <> ERROR_SUCCESS Then
      Print "Error Opening RegistryKey"
   
   Else
      lResult = RegQueryInfoKey(hkey,NULL,NULL,NULL,@dwKeys,NULL,NULL,NULL,NULL,NULL,NULL,NULL)
      Dim sCurrentKey As ZString * 1096
      ReDim sKeys(0 To dwKeys)
      dwMaxLen = 1096
      For i As Integer = 0 To UBound(sKeys) -1
         lResult = RegEnumKeyEx(hkey,i,StrPtr(sCurrentKey),@dwMaxLen,NULL,NULL,NULL,NULL)
         If lResult <> ERROR_SUCCESS Then Print "Error while reading Key"
         Print sCurrentKey
      Next
   EndIf
   
End Sub

ReDim keys() As String
RegGetSubkeys(HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP", keys())

Sleep

Die String-Länge müsstest du zwar nicht statisch angeben, sondern könntest mit dem RegQueryInfoKey Aufruf ermitteln, aber ansonsten seh ich auf die schnelle keinen Fehler.
In meinem COM-Port Beispiel hab ich das z.B. so gemacht.

Kommts bei dem kurzen Testprogramm, was ich verwendet hab, was eben nur deine Methode und das nötigste drumherum enthält auch zu diesem Fehler? Welche Ausgabe erhältst du? Liefern die API Aufrufe Fehlercodes? Arbeitest du evt. mit Unicode (obwohl da zwei Zeichen auch seltsam wären, da würd eigentlich nur eins angezeigt werden)?
Welche Betriebssystem/Compilerversion? Verwendest du original Windows Header oder modifizierte? ...

.. Hab leider auch keinen konkreten Rat.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Ryko



Anmeldungsdatum: 02.01.2013
Beiträge: 12

BeitragVerfasst am: 16.02.2013, 00:37    Titel: Antworten mit Zitat

Hmm komisch ich hab WinXp Sp3 und den FB Compiler 0.24.
Das mit dem RegQueryInfoKey hatte ich schon.Wenn ich aber in RegEnumKeyEx dann den Pointer auf die Variable gesetzt habe ,ist mir das Programm mit ner unbehandelten Ausnahme + Jit Debugger von Visual Studio abgeschmiert.
Vllt hätte ich noch sagen sollen dass ich es unter HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion versucht habe,welcher ja relativ viele Subkeys hat.Bei Schlüsseln die weniger Subkeys haben funktioniert es wie gewollt.Auch dein Snippet klappt unter dem oben genannten Schlüssel nicht.
Unicode verwende ich nicht.
Nach den ersten 3 Subkeys liefert er Error_Sucess zurück,bei allen anderen dann ERROR_MORE_DATA was ja okay ist.Vorallem scheint sich das ganze zu wiederholen ich bekomme bestimmt gute 10mal Ext ausgegeben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 16.02.2013, 01:27    Titel: Antworten mit Zitat

Das funktioniert bei mir mit dem angegebenen Schlüssel:
Code:
#Include "windows.bi"

Sub RegGetSubkeys(ByVal Hive As HKEY,ByVal sKey As String,sKeys() As String)
   Dim hkey As HKEY,lResult As Long,dwKeys As DWORD,dwMaxLen As DWORD
   lResult = RegOpenKeyEx(Hive,StrPtr(sKey),NULL,KEY_ALL_ACCESS,@hkey)
   
   If lResult <> ERROR_SUCCESS Then
      Print "Error Opening RegistryKey"
   
   Else
      Dim maxNameLen As Integer
      lResult = RegQueryInfoKey(hkey,NULL,NULL,NULL,@dwKeys,@maxNameLen,NULL,NULL,NULL,NULL,NULL,NULL)
      Dim sCurrentKey As String = String(maxNameLen, 0)
      
      ReDim sKeys(0 To dwKeys)
      For i As Integer = 0 To UBound(sKeys) -1
         dwMaxLen = maxNameLen+1 'terminating NULL byte not included in result from RegQueryInfoKey, but has to be included here
                                 'FBStrings have an terminating NULL byte (additional to its length), so no problem with buffer size
         lResult = RegEnumKeyEx(hkey,i,StrPtr(sCurrentKey),@dwMaxLen,NULL,NULL,NULL,NULL)
         If lResult <> ERROR_SUCCESS Then Print "Error while reading Key ("; lResult; ")"
         Print Left(sCurrentKey, dwMaxLen)
      Next
   EndIf
   
End Sub

ReDim keys() As String
RegGetSubkeys(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion", keys())

Sleep

Dein obiger Code funktioniert bei diesem Schlüssel bei mir genausowenig. Ich bekomm auch Error 243 (was wohl ERROR_MORE_DATA is; hab grad nix da zum nachschaun). Wie er das handhabt weiß ich jetzt nicht auswendig, offenbar gibts dabei jedoch irgendein problem, denn wenn man den Puffer groß genug macht funktionierts.
Ich schau's mir morgen vielleicht noch genauer an.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Ryko



Anmeldungsdatum: 02.01.2013
Beiträge: 12

BeitragVerfasst am: 16.02.2013, 11:48    Titel: Antworten mit Zitat

Mit deinem Code funktioniert es St_W .Da hatte ich wohl was mit den Error Codes verwechselt,ich hatte gedacht solang es noch Subkeys gibt,gibt er ERROR_MORE_DATA zurück,aber eigentlich sollte es ERROR_NO_MORE_ITEMS sein.In der MSDN Dokumentatin steht es auch nochmal:
Zitat:
If the lpName buffer is too small to receive the name of the key, the function returns ERROR_MORE_DATA.


Vielen Dank für die Hilfe ihr beiden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz