Применение 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий