C# - 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.
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",,"CINFInstall"
A mellékelt alkalmazás nem programot 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”.
public string INFPath 
{
  get
  {
    return infpath;
  }
  set
  {
    infpath = value;
  }
}
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 ShellExecute metódus menedzselt deklarációja a következő:
[DllImport("Shell32")]
public static extern int ShellExecuteA(int hwnd, String lpOperation, String lpFile, String lpParameters, String lpDirectory, int nShowCmd);
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 csupán az INF állomány létezését ellenőrizzük, és meghívjuk a ShellExecute metódust.
bool result = true;
if (File.Exists(infpath))
{
     ShellExecuteA(0,"open","rundll32.exe","setupapi,InstallHinfSection DefaultInstall 132 "  + infpath,null,SW_HIDE);
}
A művelet eredményeképpen bekerül a Name=DINFInstall név-érték pár a Rendszerleíró adatbázisba.