Delphi - A Windows Shell titkai

WinShell 5. rész

forráskód letöltése
Ha rámutatunk, illetve kiválasztunk egy állományt a Windows Intézőjében, akkor alul, a státusz sorban megjelenik néhány jellemző információ az adott állományról. Ha eltelik egy kis idő és még nem mozdultunk el az egérrel, akkor egy kis súgó ablak (Hint) jelenik meg az egér mellett, ahol szintén ezeket az információkat láthatjuk.

Ha van egy saját típusú állományunk, akkor ehhez készíthetünk egy olyan alkalmazást, mely egyedi információt jelenít meg az állományunkról.

Persze lehetőségünk van arra is, hogy egy már létező állományról jelenítsünk meg tetszőleges információt. Mellékelt példában azt valósítjuk meg, hogy egy TXT állomány esetén az állományban lévő szöveg első sorát, valamint az aktuális időpontot jelenítjük meg a felhasználó számára. Így például az állomány megnyitása nélkül beleolvashatunk annak tartalmába. A mellékelt példa kipróbálásához az alábbi lépésekre van szükség:
1. Nyissa meg a ShellInfoExt.dpr-t.
2. A Project - Build menüponttal fordítsa le. Ekkor létrejön a ShellInfoExt.dll.
3. Nyissa meg szerkesztésre a mellékelt ShellInfoExt.reg állományt. Például egy Windows Intézővel keresse meg. Jobb gombbal kattintson rá, majd válassza az Edit menüpontot.
4. Ebben az állományban a @="D:\\Dso\\0249\\ShellSecret05\\ ShellInfoExt.dll" sorban található elérési útvonalat javítsa ki arra, ahová a mellékelt példaprogramot helyezte. Lényeg az, hogy a ShellInfoExt.dll-nek itt korrektül meg legyen adva a helye. Ügyeljen arra is, hogy az elérési útvonal megadásánál a \ jelet duplázva kell használnia!
5. Mentse és zárja a ShellInfoExt.reg állományt.
6. Kattintson rá a ShellInfoExt.reg állományra. Ekkor a Windows megkérdezi, hogy szeretné-e tartalmát a regisztrációs adatbázishoz hozzáfűzni. Erre igennel válaszoljon.
7. Egy Windows Intézőben mutasson rá egy tetszőleges TXT állományra.

Fontos tudnivaló, hogy ez a lehetőség Win9x esetén csak az Internet Explorer 5-ös változatának telepítése után, illetve NT esetén csak Win 2000-től kezdve használható.

A feladat megoldásához most is egy speciális DLL készítésére lesz szükségünk, mely képes együttműködni a Windows Intézőjével. Ehhez a DLL-hez az IQueryInfo és IPersistFile interfészeket kell felhasználnunk.

Az IPersistFile-ra csupán azért van szükségünk, hogy megállapíthassuk, hogy melyik állományról kell majdan az egyedi információkat szolgáltatnunk. Ehhez elegendő a Load metódusát felhasználnunk, a többire nem is lesz szükségünk.

Amikor a Load meghívásra kerül, akkor paraméterként kapjuk az adott állomány nevét. Ekkor nincs más teendőnk, mint ezt az értéket eltárolni egy későbbi felhasználáshoz.
function TShellInfo.Load(pszFileName: POleStr; 
      dwMode: Integer): HResult;
begin
  FFileName:=pszFileName;
  result:=S_OK;
end;
Amikor a Windows Intézőjének szüksége van a megjelenítendő információra, akkor kerül meghívásra az IQueryInfo GetInfoTip metódusa.

Itt nincs más teendőnk, mint a paraméterként kapott ppwszTip paraméterbe bemásolni a megjeleníteni kívánt sztringet.

Ehhez azonban ezt létre kell hoznunk. A feladatban most a TXT állomány első sorát és az aktuális időpontot kell visszaadnunk. Az első sorhoz be kell olvasnunk mit is tartalmaz a TXT. Ehhez egy TStringList-et használunk fel, ahol a LoadFromFile-al beolvassuk az imént eltárolt állományt. Ezek után a TXT első sora már könnyen kiolvasható egy S lokális változóba. Végül már csak az aktuális időpontot kell konvertálnunk sztringgé és ezt hozzáadni az S változóhoz.

A megjelenítendő szöveg most már az S változóban rendelkezésre áll. Ezt viszont nem tudjuk közvetlenül visszaadni, mivel ppwszTip egy WideChar-ra mutató pointer. Le kell tehát foglalnunk egy megfelelő méretű memória területet, amelyre konvertálhatjuk a sztringünket WideChar típusúra, majd a memóriaterületre mutató pointert adhatjuk értékül a ppwszTip paraméternek.

Memória foglaláshoz az IMalloc interfészt kell felhasználnunk. Ennek Alloc nevű függvénnyével foglalhatjuk le a szükséges méretet. A függvény visszatérési értéke a lefoglalt memóriaterületre mutat, így ezt az értéket rögtön a ppwszTip paraméternek átadjuk.

Végül a StringToWideChar függvényhívással konvertáljuk az S sztringünket WideChar típussá.
function TShellInfo.GetInfoTip(dwFlags: DWORD; 
    var ppwszTip: PWideChar): HResult;
var
  s: string;
  len: integer;
  list: TStringList;
begin
  s:='';
  list:=TStringList.Create;
  list.LoadFromFile(FFileName);
  if list.Count>0 then begin
    s:=list[0];
  end;
  list.Free;
  s:='Első sor: '+s;
  s:=s+#13'Idő: '+TimeToStr(Now);

  len:=SizeOf(WideChar)*Length(s)+1;
  ppwszTip:=FMalloc.Alloc(len);
  StringToWideChar(s, ppwszTip, len);
  result:=S_OK;
end;
Az elkészült DLL-t most is a Windows regisztrációs adatbázisába kell regisztrálnunk. A módszer azonos az eddig megismertekkel. A különbség itt csak annyi, hogy nem az eddig használt kulcsok alá kell elvégeznünk a regisztrációt, hanem a {00021500-0000-0000-C000-000000000046} kulcs alá.

WinShell cikksorozat