Blog. Just Blog

Как программно создать ярлык

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как программно создать ярлык
Как программно создать ярлык

Ярлыки - одна из ключевых сущностей Windows. Это специальные файлы, служащие указателями на папки, программы или команды. Для управления ярлыками в Windows используется COM-объект ShellLink, точнее одна версия для ANSI и вторая для юникода. Они отличаются своими GUID. В любом из этих объектов реализовано по два интерфейса. Интерфейс IShellLink, с помощью которого можно получать и изменять свойства ярлыка, и интерфейс IPersistFile для работы непосредственно с самим файлом ярлыка.

Для доступа к COM-объектам первым делом надо обозначить их GUID:
  1. ; GUID {00021401-0000-0000-C000-000000000046}
  2. CLSID_ShellLink    dd 00021401h
  3.                    dw 0000h
  4.                    dw 0000h
  5.                    db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
  6.  
  7. ; GUID {000214F9-0000-0000-C000-000000000046}
  8. IID_IShellLinkW    dd 000214F9h
  9.                    dw 0000h
  10.                    dw 0000h
  11.                    db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
  12.  
  13. ; GUID {0000010B-0000-0000-C000-000000000046}
  14. IID_IPersistFile   dd 0000010Bh
  15.                    dw 0000h
  16.                    dw 0000h
  17.                    db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
Теперь надо описать интерфейсы, я сделаю это в виде структур, чтобы не путаться с индексами вызываемых методов. В одной из статей я уже отмечал, что на сайте MSDN названия методов идут не в том порядке, как они фактически представлены в интерфейсе. Не обошла проблема нестыковки и эти интерфейсы.
  1. ; IID_IShellLinkW Interface
  2. struct IShellLinkWDispatch
  3.     QueryInterface      dd ?
  4.     AddRef              dd ?
  5.     Release             dd ?
  6.  
  7.     GetPath             dd ?
  8.     GetIDList           dd ?
  9.     SetIDList           dd ?
  10.     GetDescription      dd ?
  11.     SetDescription      dd ?
  12.     GetWorkingDirectory dd ?