Интерфейс IShellLink

Этот интерфейс представляет собой средство для создания и управления ярлыками (shortcuts). Все читатели этой главы наверняка создавали и перемещали ярлыки для наиболее нужных программ, файлов и папок — на рабочем столе, в главном меню и т. д. С точки зрения ОС эти действия — не что иное, как создание и изменение свойств СОМ-объекта.

Каждый ярлык содержит следующую информацию: 

Для всех этих свойств ярлыка в интерфейсе дано по паре методов — один для чтения, другой для установки значения:

IShellLink = interface(lUnknown) 

{ si }

[SID_IShellLinkA]

function GetPath(pszFile: PAnsiChar;

 cchMaxPath: Integer; var pfd: TWin32FindData; 

fFlags: DWORD): HResult; stdcall;

function GetlDList(var ppidl: PItemlDList): HResult; stdcall;

function SetlDList(pidl: PItemlDList): HResult;

 stdcall;

function GetDescription(pszName: PAnsiChar; 

cchMaxName: Integer): HResult;

 stdcall;

function SetDescription(pszName: PAnsiChar): HResult; stdcall;

function GetWorkingDirectory(pszDir: PAnsiChar; cchMaxPath: Integer): HResult; stdcall;

function SetWorkingDirectory(pszDir: PAnsiChar): HResult; stdcall;

function GetArguments(pszArgs: PAnsiChar; cchMaxPath: Integer): HResult; stdcall;

function SetArguments(pszArgs: PAnsiChar): HResult; stdcall;

function GetHotkey(var pwHotkey: Word): HResult; stdcall;

function SetHotkey(wHotkey: Word): HResult; stdcall;

function GetShowCmd(out piShowCmd: Integer): HResult; stdcall;

function SetShowCmd(iShowCmd: Integer): HResult; stdcall;

function GetIconLocation(pszIconPath: PAnsiChar; cchlconPath: Integer; out pilcon: Integer): HResult; stdcall;

function SetlconLocation(pszIconPath: PAnsiChar; ilcon: Integer): HResult; stdcall;

function SetRelativePath(pszPathRel: PAnsiChar; dwReserved: DWORD): HResult; stdcall;

function Resolve(Wnd: HWND; fFlags: DWORD): HResult; stdcall; 

function SetPath(pszFile: PAnsiChar): HResult; stdcall; 

end;

Сохраним ярлык для данной программы-примера где-нибудь на диске, скажем, в той же самой папке. Для этого создадим новый объект NewLink класса CLSiD_shellLink, предоставляющий нам нужный интерфейс:

procedure TForml.ButtonlClick(Sender: TObject);

 var NewLink : IShellLink; 

fn, fp : string; ws : WideString; hRes : THandle;

pf : IPersistFile;

begin

NewLink := CreateComObject(CLSID_ShellLink) as IShellLink; fn := ParamStr(O); NewLink.SetPath(pchar(fn)); 

fp := ExtractFilePath(fn); NewLink.SetWorkingDirectory(pchar(fp)); NewLink.SetDescription

(pChar(Application.Title)); 

ws := fp+Application.Title+'.Ink';

hRes := NewLink.Querylnterface(IID__IPersistFile, pf) ; if Succeeded(hRes) then

pf.Save(pWideChar(ws),False);

end;

В этом примере помимо IShellLink нужно получить доступ к интерфейсу IPersistFile, который "умеет" записывать данные. Задав параметры ярлыка, мы записываем его на диск. При этом проверяется тот факт, что созданный нами объект поддерживает интерфейс IPersistFile. Если указатель на этот интерфейс получен, вызывается его метод save.

Среди перечисленных выше методов IShellLink особое внимание уделим методу Resolve. Он понадобится вам при получении указателя на интерфейс уже существующих ярлыков. Windows пытается вести себя "разумно" и отслеживает перемещения и переименования объекта, на который указывает существующий IShellLink. Но если вы записали содержимое ярлыка в поток (или на диск), то отследить соответствие ярлыка объекту должны сами, вызвав метод Resolve. Если объект, на который ссылается ярлык, по-прежнему находится на своем месте, метод немедленно завершается с нормальным кодом возврата. Если файл или объект перемещен или переименован, начинается его поиск (рис. 31.2).

Рис. 31.2. Поиск объекта, на который указывает ярлык

Знакомая картина, не правда ли? Особенно часто она наблюдается в том случае, если пользователь не выработал у себя привычки правильно деинсталлировать раздобытый где-то "софт", стирая его "по старинке". Между тем, за привычным диалоговым окном на рисунке стоит вызов метода ishellLink. Resolve. Если в пределах досягаемости поиска окажется файл с тем же именем и размерами, ярлык будет автоматически переадресован на него; в противном случае пользователю будет предложено использовать ближайший по характеристикам файл из просмотренных. Если вы вообще не хотите, чтобы пользователь вмешивался в процесс отыскания соответствия, при вызове метода Resolve в параметре fFlags укажите значение SLR_NO_UI — диалоговое окно появляться в этом случае не будет.

Если вы внимательно изучили рабочий стол своего компьютера, то должны были заметить там ярлыки, ссылающиеся не на файлы, а на специальные объекты — "Мой компьютер", "Сетевое окружение", "Принтеры" и т. п. Чтобы создать такой ярлык самому, нужно обращение к методу setiDList. В качестве параметра ему передается структура pitemiDList (pidi). О том, где ее взять и как заполнить, рассказано в следующем разделе.

 


Знаете ли Вы, что такое "Большой Взрыв"?
Согласно рупору релятивистской идеологии Википедии "Большой взрыв (англ. Big Bang) - это космологическая модель, описывающая раннее развитие Вселенной, а именно - начало расширения Вселенной, перед которым Вселенная находилась в сингулярном состоянии. Обычно сейчас автоматически сочетают теорию Большого взрыва и модель горячей Вселенной, но эти концепции независимы и исторически существовало также представление о холодной начальной Вселенной вблизи Большого взрыва. Именно сочетание теории Большого взрыва с теорией горячей Вселенной, подкрепляемое существованием реликтового излучения..."
В этой тираде количество нонсенсов (бессмыслиц) больше, чем количество предложений, иначе просто трудно запутать сознание обывателя до такой степени, чтобы он поверил в эту ахинею.
На самом деле взорваться что-либо может только в уже имеющемся пространстве.
Без этого никакого взрыва в принципе быть не может, так как "взрыв" - понятие, применимое только внутри уже имеющегося пространства. А раз так, то есть, если пространство вселенной уже было до БВ, то БВ не может быть началом Вселенной в принципе. Это во-первых.
Во-вторых, Вселенная - это не обычный конечный объект с границами, это сама бесконечность во времени и пространстве. У нее нет начала и конца, а также пространственных границ уже по ее определению: она есть всё (потому и называется Вселенной).
В третьих, фраза "представление о холодной начальной Вселенной вблизи Большого взрыва" тоже есть сплошной нонсенс.
Что могло быть "вблизи Большого взрыва", если самой Вселенной там еще не было? Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution