Шаг 8.
Применение COM-объектов, входящих в Windows. Создание ярлыков

    На этом шаге мы рассмотрим создание ярлыков.

    Как известно, ссылки для запуска приложений сохраняются в соответствующих директориях в виде ярлыков (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.
Текст этого приложения можно взять здесь (5,5 Кб).

    При выполнении этого кода сначала создается СОМ-объект, который поддерживает несколько стандартных СОМ-интерфейсов, в частности IShellLink и IPersistFile. В интерфейсе IShellLink следует определить ряд обязательных параметров - путь и имя исполняемого файла, рабочий каталог приложения. Можно также определить некоторые необязательные параметры, например выбрать другую пиктограмму для ярлыка или указать, в каком состоянии должно быть при запуске главное окно приложения - в минимизированном, максимизированном или нормальном.

    Интерфейс IPersistFile служит для запоминания или считывания файла *.lnk. В качестве параметра он использует один из стандартных каталогов Windows - Desktop, Program Files и др.

    Обратите внимание на то, что никогда не следует указывать имена этих каталогов в явном виде - в различных языковых версиях Windows они могут быть различными! Например, каталогу Main Menu | Program Files английской версии Windows соответствует каталог "Главное меню | Программы" в соответствующей русской версии Windows. Следует также помнить, что имена, присваиваемые по умолчанию при установке Windows всем специальным каталогам, могут быть впоследствии изменены.

    По этой причине необходимо использовать метод SHGetSpecialFolderLocation и вслед за ним SHGetPathFromIDList для получения физического адреса специальных каталогов. Эти методы вместе со списком констант, определяющих тип специальных каталогов, приведены в модуле ShlObj.

    На следующем шаге мы рассмотрим пример, позволяющий получать сообщения о действиях с каталогами в Windows Explorer.




Предыдущий шаг Содержание Следующий шаг