На этом шаге мы рассмотрим создание ярлыков.
Как известно, ссылки для запуска приложений сохраняются в соответствующих директориях в виде ярлыков (Shotcuts) - файлов с расширением *.lnk. Это двоичные файлы, имеющие достаточно сложную структуру. Для их создания в Windows 3.x использовался динамический обмен данными DDE (Dynamic Data Exchange) с приложением Program Manager, которое всегда запущено при работе Windows 3.1/3.11. Для создания такого файла в Windows 95 и старше можно также использовать динамический обмен данными с Program Manager, но для этого его нужно обязательно предварительно запустить (например, набрав Progman после команды Run (Выполнить) главного меню); в противном случае команды DDE не станут выполняться. Кроме того, компанией Microsoft было объявлено о недопустимости использования DDE при создании новых приложений; поддержка динамического обмена данными сохраняется только с целью обеспечения работоспособности ранее созданных приложений.
Конечно, можно создать ярлык непосредственно с помощью записи двоичных данных, однако для этой цели необходимо знать формат такого файла. Вместо этого можно воспользоваться тем, что программный интерфейс Microsoft Shell API полностью базируется на СОМ-технологии.
Приведем простейший пример, в котором используется этот факт. Поместим кнопку на главную форму приложения и создадим для нее обработчик события OnClick, создающий ярлык на это же самое приложение на Рабочем столе Windows:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses ComObj, ActiveX, ShlObj; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var LinkFile:IPersistFile; ShellObject:IUnknown; ShellLink:IShellLink; FileName,ShortcutPosition:string; WShortcutPosition:WideString; P:PItemIDList; C:array[0..1000] of char; begin ShellObject:=CreateComObject(CLSID_ShellLink); LinkFile:=ShellObject as IPersistFile; ShellLink:=ShellObject as IShellLink; FileName:=ParamStr(0); ShellLink.SetPath(pchar(FileName)); ShellLink.SetWorkingDirectory(pchar(ExtractFilePath(FileName))); if SHGetSpecialFolderLocation(Handle,CSIDL_DESKTOP,P)= NOERROR then begin SHGetPathFromIDList(P,C); ShortcutPosition:=StrPas(C); ShortcutPosition:=ShortcutPosition+ '\'+'TheProgram.lnk'; WShortcutPosition:=ShortcutPosition; LinkFile.Save(PWChar(WShortcutPosition),False); end; end; end.
При выполнении этого кода сначала создается СОМ-объект, который поддерживает несколько стандартных СОМ-интерфейсов, в частности IShellLink и IPersistFile. В интерфейсе IShellLink следует определить ряд обязательных параметров - путь и имя исполняемого файла, рабочий каталог приложения. Можно также определить некоторые необязательные параметры, например выбрать другую пиктограмму для ярлыка или указать, в каком состоянии должно быть при запуске главное окно приложения - в минимизированном, максимизированном или нормальном.
Интерфейс IPersistFile служит для запоминания или считывания файла *.lnk. В качестве параметра он использует один из стандартных каталогов Windows - Desktop, Program Files и др.
Обратите внимание на то, что никогда не следует указывать имена этих каталогов в явном виде - в различных языковых версиях Windows они могут быть различными! Например, каталогу Main Menu | Program Files английской версии Windows соответствует каталог "Главное меню | Программы" в соответствующей русской версии Windows. Следует также помнить, что имена, присваиваемые по умолчанию при установке Windows всем специальным каталогам, могут быть впоследствии изменены.
По этой причине необходимо использовать метод SHGetSpecialFolderLocation и вслед за ним SHGetPathFromIDList для получения физического адреса специальных каталогов. Эти методы вместе со списком констант, определяющих тип специальных каталогов, приведены в модуле ShlObj.
На следующем шаге мы рассмотрим пример, позволяющий получать сообщения о действиях с каталогами в Windows Explorer.