Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 156. - jak na zástupce

Jan Šindelář 29.9.2004

V dnešním pokračování seriálu se budeme zabývat zástupci. Ukážeme si, jaké typy známe a jak pracovat s jejich soubory.

Co je to "zástupce" snad netřeba příliš vysvětlovat. S příchodem Windows 95 jsme je začali všichni používat zcela běžně a každý asi ví, že zástupce, který je rozeznat od skutečného fyzického souboru na disku (resp. aplikace či dokumentu, protože zástupce sám o sobě je pochopitelně také soubor) malou šipkou na ikoně, slouží jako odkaz na jiný zdroj. Kliknutím na tento odkaz se tedy spustí skutečná aplikace, dokument a podobě a případným smazáním zástupce nebude odkazovaný cílový objekt nijak ovlivněn. Tohle tedy každý ví a běžně používá.

Dalo by se říci, že existují dva druhy zástupců a to jak svým zaměřením, tak i formátem souboru, ve kterém jsou uloženy. Prvním typem je zástupce (či zde spíše obvyklejší pojmenování "odkaz") na nějaký externí zdroj, zpravidla webovou stránku. V systému se mu říká "Zástupce internetové adresy", má většinou ikonku webového prohlížeče a je uložen na disku v souboru s koncovkou URL. Takový soubor je vlastně svým způsobem obyčejný INI soubor, protože je to textový soubor, rozdělený do příslušných sekcí a můžete si jej snadno prohlédnout a editovat třeba v Poznámkovém bloku. Zkusit si to můžete hned teď, protože pokud používáte Internet Explorer a máte uloženy nějaké Oblíbené položky, jsou tyto odkazy uloženy právě v podobě jednotlivých URL souborů. Práce s těmito soubory je pak snadná, užívají se stejné postupy jako u INI souborů a zabývat se jimi nebudeme.

Zajímavější z programátorského hlediska je druhý typ zástupce, který odkazuje na nějaký lokální soubor či dokument. Má ikonu příslušné aplikace, která je pochopitelně opět opatřenou šipkou, pokud si ručně v registrech či pomocí nějakého "tweakovacího" programu šipky neodstraníte. Takový zástupce je pak uložen v souboru LNK, což je binární soubor, se kterým si v Poznámkovém bloku už příliš legrace neužijete. Jak z toho souboru dostat to nejcennější, tedy cíl, na který zástupce odkazuje, to bude právě cílem dnešního příkladu.

Zaklínadlem našeho postupu bude API rozhraní IShellLink (více informací zde na MSDN) a funkce GetPath, jejíž název hovoří jasně, k čemu slouží. Funkce pro získání cesty ke zdroji, na který zástupce odkazuje, pak bude vypadat takto:

function GetTarget(const LinkFileName:String):String;
var
  psl: IShellLink;
  ppf: IPersistFile;
  WidePath: array[0..260] of WideChar;
  Info: array[0..MAX_PATH] of Char;
  wfs: TWin32FindData;
begin
  CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl);
  if psl.QueryInterface(IPersistFile, ppf) = 0 then
  begin
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PChar(LinkFileName), -1, @WidePath, MAX_PATH);
    ppf.Load(WidePath, STGM_READ);
    psl.GetPath(@info, MAX_PATH, wfs, SLGP_UNCPRIORITY);
    Result := info;
  end
  else
    Result := ``;
end;

Parametrem je soubor LNK a výstupem funkce je pak cesta ke zdroji. Aby funkce fungovala, budeme potřebovat ještě do uses přidat knihovny ShlObj a ActiveX. A to je vše, funkce je hotová. Chcete-li experimentovat, výše uvedený odkaz je ideální zdroj informací.