|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Ryko
Anmeldungsdatum: 02.01.2013 Beiträge: 12
|
Verfasst am: 16.02.2013, 00:46 Titel: RegEnumValue liefert nur halbe Werte zurück |
|
|
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 |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 16.02.2013, 01:18 Titel: |
|
|
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 |
|
|
Ryko
Anmeldungsdatum: 02.01.2013 Beiträge: 12
|
Verfasst am: 16.02.2013, 01:37 Titel: |
|
|
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 |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 16.02.2013, 02:27 Titel: |
|
|
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 |
|
|
Ryko
Anmeldungsdatum: 02.01.2013 Beiträge: 12
|
Verfasst am: 16.02.2013, 12:48 Titel: |
|
|
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 |
|
|
|
|
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.
|
|