Delphi - REG_MULTI_SZ adattípus olvasása a Registry-ből

forráskód letöltése
A Rendszerleíró adatbázis szűk egy tucatnyi típusban tárolja a szoftverek számára szükséges információkat. A tárolt adatok kiolvasása néhány típus esetében egyszerűen megoldható, vannak azonban komplikáltabbak is. Ide tartozik a REG_MULTI_SZ típus, melyből kicsit körülményesebben nyerhetők ki az adatok. Cikkünkben bemutatunk egy módszert ennek a problémának a megoldására.
A REG_MULTI_SZ típus több, nullával lezárt karakterláncot tartalmaz, melyek egy karakterláncot alkotnak. Ennek megfelelően a teljes karakterlánc végén két nullát találunk záróelemként. Erre a kiolvasáskor kell figyelnünk.
A mellékelt példában egy ilyen típusú bejegyzés értékét olvassuk ki úgy, hogy a tárolt karakterláncok a Form TMemo komponensében megjelenjenek. A bejegyzés a következő kulcs alatt található:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\cdrom
A bejegyzés neve pedig AutoRunAlwaysDisable lesz.
A kiolvasás műveletét a Reading metódusba ágyaztuk, melynek paraméterei a következő adatokat tartalmazzák:
  • A főkulcs neve.
  • Az alkulcs, melyben a bejegyzés található.
  • A bejegyzés neve.
  • Egy TString lista, mely a kiolvasott karakterláncokat tartalmazza.
A metódusban első lépésben megnyitjuk a megadott alkulcsot olvasásra:
if RegOpenKeyEx(CurrentKey, PChar(Subkey),0, KEY_READ, key) = ERROR_SUCCESS then
...
Ha ez sikerült, akkor a RegQueryValueEx metódussal kiolvassuk a bejegyzés típusát.
  SetLastError(RegQueryValueEx(key,PChar(ValueName), nil,@vType, nil, @vLen));
Ha ez hiba nélkül megtörtént, akkor ellenőrizzük, hogy a típus REG_MULTI_SZ vagy sem.
    if vType = REG_MULTI_SZ then
      begin
Amennyiben a típus megfelelő, akkor a kívánt területű memóriarész lefoglaljuk.
        GetMem(buffer, vLen);
Ezt követően elvégezzük a kiolvasást egy ciklusban, mely addig tart, míg a záró nulla karaktert meg nem találjuk.
        RegQueryValueEx(key,PChar(ValueName),nil,nil,PBYTE(buffer),@vLen);
        p := buffer;
        while p^ <> #0 do
        begin
          Strings.Add(p);
          Inc(p, lstrlen(p) + 1)
        end
Utolsó lépés, hogy a memóriaterületet felszabadítsuk.
        FreeMem(buffer)
        ...
A tárolt karakterláncokat a memóriában a következőképpen kell elképzelni:
string1\0string2\0string3\0laststring\0\0
A metódus hívása a következőképpen történik a gomb megnyomása után:
Reading(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\cdrom','AutoRunAlwaysDisable', Memo1.Lines);