REG_RESOURCE_LIST czytanie

0

Tak jak w temacie, mam problem z czytaniem REG_RESOURCE_LIST oraz REG_FULL_RESOURCE_DESCRIPTOR (jak możecie zobaczyć dalej nie jest to aż tak ważne.. bo póki co kod to pomija). Z REG_MULTI_SZ uporałem się po wielu problemach. Oto kod który ma czytać te dane:

if reg.GetDataInfo(lst[i],r) then
         begin
         case r.RegData of
              rdString,rdExpandString:CheckKey(s+'\'+lst[i],reg.ReadString(lst[i]));
              rdInteger:CheckKey(s+'\'+lst[i],inttostr(reg.ReadInteger(lst[i])));
              else begin
              if (r.DataSize>0)and(DWORD(r.RegData)<>REG_FULL_RESOURCE_DESCRIPTOR) then
                 begin
                 if DWORD(r.RegData)=REG_MULTI_SZ then
                    begin
                    ReadMultiSZ(reg,lst[i],s2);
                    CheckKey(s+'\'+lst[i],s2);
                    continue;
                    end;
                 //setlength(dat,r.DataSize);
                 GetMem(dat,r.DataSize);
                 reg.ReadBinaryData(lst[i],pointer(dat)^,r.DataSize);
                 setlength(s2,r.DataSize);
                 p:=dat-1;
                 for j:=0 to r.DataSize-1 do
                     begin
                     inc(p);
                     s2[j]:=p^;
                     end;
                 CheckKey(s+'\'+lst[i],s2);
                 end;
              end;
              end;
         end else writeln('Failed to read ',s+'\'+lst[i]);

Tak jak widzicie czytam to za pomocą ReadBinaryData, ale niestety nie działa to z typem wymienionym w temacie.
Chodzi mi o przeczytanie zawartości, nie musi to mieć sensu większego. Tj. liczy się przeczytanie, nie zrozumienie danych. Nie pytajcie po co :-] .
Jeśli okaże się to pomocne, korzystam z najnowszego Lazarusa (0.9.30 z FPC 2.4.2).
Tego typu klucze można znaleźć w okolicach HKEY_LOCAL_MACHINE\HARDWARE\RESOURCEMAP\Hardware Abstraction Layer .
A, i żeby nie było, szukałem już w google oraz forum.

P.S. Wiem że zapomniałem zwolnić pamięć . .

0

Rozwiązanie okazało się proste - nie należy używać opakowanych procedur Delphi, bo robią dziwne rzeczy. Kod który działa ze wszystkim co da się przeczytać:

if (r.DataSize>0) then
                 begin
                 setlength(s2,r.DataSize);
                 RegQueryValueEx (reg.CurrentKey, PChar (lst[i]), Nil, Nil, PBYTE (s2), @r.DataSize);
                 CheckKey(s+'\'+lst[i],s2);
                 end;
              end;
              end;
         end else writeln('Failed to read ',s+'\'+lst[i]); 

1 użytkowników online, w tym zalogowanych: 0, gości: 1