Delphi - INF állományok használata

forráskód letöltése
Az .INF kiterjesztésű állományok hasznos segítséget nyújtanak az alkalmazások telepítésében. Ezekben az állományokban rugalmasan megadhatjuk, hogy milyen kezdeti bejegyzések kerüljenek a Rendszerleíró adatbázisba, illetve milyen mappában legyen megtalálható a telepített program. Cikkünkben elkészítünk egy komponenst, mely képes lesz felhasználni az INF állományban található információkat.
A mellékelt példaprogram megnyitása előtt az INFInstaller.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component – Install Component menüpontot.
Az INF állományok felépítése azonos a konfigurációs INI állományok felépítésével. Az INF állományok esetében meghatározott nevek kerülhetnek a [] jelek közé, melyeket saját kulcsnevekkel is kiegészíthetünk.
A melléklet példa mappájában elhelyeztünk egy INF kiterjesztésű állományt, melynek első két szegmensneve szabályos, rögzített név, míg a másik két név saját kreáció. A [version] szegmens tartalmazza a mellékelt INF fájl adatait, beleértve a verzióra, típusra vonatkozó információkat. Ez az egyetlen szegmens, melynek kötelezően szerepelnie kell az állományban. Ha ez elmarad, a folyamat már az INF állomány beolvasásakor megszakad.
[version]
signature="$Windows NT$"
...
A signature kulcsszó és a hozzákapcsolódó karakter-konstans közli a telepítővel, hogy az állomány a várt formátumot tartalmazza.
A DestinationDirs szegmensben adjuk meg a telepítési mappát.
[DestinationDirs]
C:\Program Files\
A StartOptions szegmens pedig egy Registry bejegyzés adatait tartalmazza, melyet a komponensünk elhelyez majd a megfelelő helyen.
[StartOptions]
HKLM,"Software\Animare\","Name",,"DINFInstall"
A melléklelt alkalmazás nem telepít programot a rendszerbe, csupán ezt a bejegyzést helyezi el a Rendszerleíró adatbázisban, melyet majd ellenőrizhetünk.
A komponensünk egyetlen karakterlánc típusú property-t tartalmaz, melyben megadhatjuk a telepítési információkat tartalmazó INF állomány elérési útvonalát. Ennek megadása után kell meghívnunk az Install metódust, mely elvégzi a „telepítést”.
Az Install metódusban egy már ismert API metódust, a ShellExecute függvényt hívjuk meg. A telepítéskor ugyanis a Rundll32.exe segédprogramot kell ugyanis megfelelően paramétereznünk.
A Rundll32.exe alkalmazás képes ugyanis arra, hogy egy DLL-ben található metódust meghívjon úgy, hogy a memóriába töltse a DLL-t (ehhez a LoadLibrary metódust használja fel). A Rundll32.exe segédprogram szintaxisa a következő:
Rundll32.exe <DLL állomány neve> <Metódus neve> [argumentumok]
E szintaxisnak megfelelően paraméterezzük a Rundll32.exe-t mi is. A metódus segítségével a SETUPAPI.DLL InstallHinfSection metódusát hívjuk meg, mely képes arra, hogy az INF egy adott szegmensében megtalálható információkat felhasználja.
A parancssor, mellyel a rundll32.exe alkalmazást le kell futtatnunk, a következőképpen fest:
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 <INF állomány elérési útja>
Az Install metódusban elsőként deklarálunk egy HINST típusú változót, melyben a ShellExecute metódus visszatérési értékét tároljuk.
function TINFInstaller.Install: boolean;
var
  instance: HINST;
Ezt követően meghívjuk a függvényt, majd ellenőrizzük, hogy a művelet sikeres volt-e. Amennyiben a visszatérési érték nagyobb, mint 32, akkor sikeres volt. Ellenkező esetben egy hibaüzenetet tartalmazó ablak jelenik meg.
  instance := ShellExecute(0,PChar('open'),PChar('rundll32.exe'),   PChar('setupapi,InstallHinfSection DefaultInstall 132 ' + FINFPath), nil, SW_HIDE);
  Result := instance > 32;
A művelet eredményeképpen bekerül a Name=DINFInstall név-érték pár a Rendszerleíró adatbázisba.