HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

A Start menü megtisztítása a hibás linkektől


Példaprogram letöltése

16878 bájt

Aki sokat telepít, és aztán töröl ilyen-olyan programokat, előbb vagy utóbb a Start Menüje tele lesz olyan linkekkel, amelyek már nem létező programokra, fájlokra mutatnak. Ebben a példában egy olyan komponenst készítünk, amely végignézi a Start Menüben lévő linkeket, és törli azokat, amelyek már nem érvényesek.
A mellékelt példaprogram megnyitása előtt a CleanStartMenu.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A komponens működését több property-vel szabályozhatjuk. A FindFile property-vel megadhatjuk, hogy ha egy link nem létező fájlra mutat, akkor keresse-e meg a fájlt egy másik helyen, vagy ne. A DisplayFindDialog, a FindTimeOut és az UpdateLink property-k is szorosan ehhez kapcsolódnak. Ez azt jelenti, hogy ezeknek csak az UpdateLink property igaz értéke esetén van jelentősége. Ha a DisplayFindDialog property értéke igaz, akkor a fájl keresésekor megjeleníti a dialógus ablakot, amely segítségével leállíthatjuk a keresést, vagy megadhatjuk a fájl elérési útvonalát (ha ismerjük). A FindTimeOut property-nek akkor van jelentősége, ha a DisplayFindDialog property értéke hamis. Ebben az esetben a keresés legfeljebb az ebben a property-ben beállított ideig tart. Az időt ezredmásodpercben kell megadni. Az UpdateLink property-vel azt állíthatjuk be, hogy a megtalált fájl esetén frissítse-e a linket, vagy sem.
A hibás linkek törlése után, illetve egyébként is előfordulhat olyan eset, hogy egy-egy mappa üresen marad a Start Menüben. Ebben az esetben a DeleteEmptyFolders property-vel szabályozhatjuk, hogy ezek a mappák törölve legyenek-e, vagy sem. Ezzel viszont nagyon vigyázzunk! Ugyanis ha a Start Menüben beállítottuk a „Testreszabott menük használata” opciót, akkor előfordulhatnak olyan üres mappák is, amelyek egyébként tartalmaznak linkeket, de mivel azokat már régóta nem használjuk, ezért el vannak rejtve. Ha ezt az property-t igazra állítjuk, akkor a fent említett opciót kapcsoljuk ki a menü beállításainál.

A művelet az Execute eljárás meghívásával kezdődik. Szükség van a Start Menü elérési útvonalára, amiből kettő is lesz. Az egyik a közös, a másik pedig a bejelentkezett felhasználó Start Menüje. Mindkettőt az SHGetSpecalFolderPath függvénnyel kérdezzük le. Az első paraméter az ablak azonosítója, a második egy buffer, amiben az útvonalat kapjuk meg, a harmadik egy konstans, amivel a mappát azonosítjuk, a negyedik pedig egy logikai érték, amivel megadhatjuk, hogy létrehozza-e a mappát, vagy sem, ha az nem létezik. A közös menü azonosítója CSIDL_COMMON_STARTMENU, a bejelentkezett felhasználóé pedig CSIDL_STARTMENU.
var
  path: array[0..MAX_PATH] of char;
...
  SHGetSpecialFolderPath((Owner as TForm).Handle, path, CSIDL_COMMON_STARTMENU, false);
Ha megvan az útvonal, akkor meghívjuk a ScanMenu eljárást, paraméterként átadva az útvonalat.
A ScanMenu egy olyan eljárás, amely rekurzívan beolvassa a paraméterben megadott könyvtár tartalmát. Ha az éppen beolvasott fájl kiterjesztése .lnk, akkor meghívja a CheckLink eljárást, paraméterként megadva a fájl nevét és elérési útvonalát.
A CheckLink eljárás ellenőrzi, hogy a paraméterként megkapott .lnk fájl érvényes hivatkozást tartalmaz-e. Ennek ellenőrzéséhez szükség lesz egy objektumra, amelyen keresztül egy IShellLink interfészt fogunk használni. Szükség lesz továbbá egy IParseFile interfészre is a fájl adatainak beolvasásához.
var
  Unknown: IUnknown;
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
...
  Unknown:=CreateComObject(CLSID_SHELLLINK);
  ShellLink:=Unknown as IShellLink;
  PersistFile:=Unknown as IPersistFile;
Ha megvannak az interfész objektumok, akkor betöltjük a .lnk fájlt az IParseFile interfészen keresztül.
  MultiByteToWideChar(CP_ACP, 0, PChar(FileName), -1, Linkb, MAX_PATH);
  if PersistFile.Load(Linkb, STGM_READ)<>S_OK then ShowMessage('ERROR');
Ha a FindFile property értéke igaz, akkor rendelkeznünk kell arról, hogy a fájl keresése megtörténjen. Ezt a ShellLink objektum Resolve eljárásával tehetjük meg. Ennek első paramétere az ablak azonosító (Handle), a második pedig különböző opciók beállítását teszi lehetővé. Ez egy 32 bites érték, aminek felső word-je tartalmazza a keresésre használható időt. Ezt ezredmásodpercben kell megadni, de csak akkor van jelentősége, ha az SLR_NO_UI flag-et is beállítjuk. Ez utóbbi azt mondja meg, hogy a keresésnél nem kell a Find Dialog-ot megjeleníteni.
    ShellLink.Resolve((Owner as TForm).Handle, flags);
A következő lépés a link adatainak beolvasása. Ez a ShellLink objektum GetPath függvényével történik.




Cikksorozat

#IDKategóriaCikk címeSorozat
1166DelphiOsztály hierarchia lekérdezése1. rész
1180DelphiOsztály hierarchia lekérdezése2. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 540. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |