A megoldás kulcsa a Registry állományban keresendő. A Registry elérését a TRegistry osztály segítségével tehetjük meg. Az osztály használatához a uses listában fel kell sorolnunk a Registry unit nevét is.
A Windows alapvetően sok modult tartalmaz. A beépülő modulok listáját mi is bővítjük, amikor új alkalmazásokat telepítünk föl számítógépünkre. A beépülő modulokról bejegyzés keletkezik a Registry állományban.
Ezek a bejegyzések a registry HKEY_CLASSES_ROOT alatti TypeLib könyvtárába kerülnek. Itt először az egyes modulok GUID azonosítóit láthatjuk. Egy azonosító alatt egy modul több verzióban is szerepelhet. Az egyes verziók az azonosítón belül külön könyvtárat kapnak, melynek neve az adott verziószám.
A keresett modul nevét ezen a könyvtáron belül találhatjuk meg. Itt egyetlen sztring típusú bejegyzés szerepel, amely nem rendelkezik változónévvel. Az értéket az üres sztring (’’) azonosítja.
A modult tartalmazó állomány elérési útját egy számot tartalmazó könyvtárban elhelyezkedő win32 könyvtárból olvashatjuk ki. Pl: ...9\WIN32.
A modulok kilistázására a GetWin32TypeLibList eljárást hozzuk létre.
procedure GetWin32TypeLibList(var Lines: TStringList);
Az eljárás végignézi a registry tartalmát, majd az elkészített listát a paraméterként megadott változóba menti el.
Első lépésként meg kell nyitnunk a registry állományt, majd be kell állítanunk az aktuális kulcsot.
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_CLASSES_ROOT;
Reg.OpenKey('TypeLib',False);
A későbbi feldolgozások során a registry kulcsot folyamatosan módosítanunk kell, az alap kulcsot a BasePath változóban tároljuk el.
A modulok GUID azonosítóit a BaseKeys változóba kérdezzük le. Ehhez a TRegistry osztály GetKeyName metódusát használhatjuk.
Reg.GetKeyNames(BaseKeys);
Fel kell dolgoznunk a BaseKeys lista összes elemét. Egy for ciklussal könnyedén végigmehetünk az összes elemen.
Mivel egy modul több verziója is jelen lehet, ki kell listáznunk a GUID-on belüli verziószámokat. Előfordulhat, hogy a verziószámok mellett HELPDIR bejegyzést is találunk, ezt nem kell figyelembe venni.
A verziószámok listája a SubKeys változóba kerül.
Reg.CloseKey;
Reg.OpenKey(BasePath+'\'+BaseKeys[i],False);
SubKeys.Clear;
Reg.GetKeyNames(SubKeys);
Amikor egy új kulcsot akarunk megnyitni a registry-ben, akkor a régit le kell zárnunk a CloseKey metódus meghívásával.
Az egyes verziószámokon belül már megtaláljuk a modul nevét, amelyet az alábbi módon tudunk lekérdezni.
Lines.Add(Reg.ReadString('')+' ('+SubKeys[j]+')');
Az elérési út keresésére a FindPath függvény szolgál.
function FindPath(Key: String): String;
Bemenő paraméterként az aktuális kulcsot kell megadnunk, visszatérési értékként a modult tartalmazó állomány elérési útját kapjuk.
A függvényben található keresési algoritmus lényege ugyanaz, mint a GetWin32TypeLibList eljárásban.