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 ?
  13.     SetWorkingDirectory dd ?
  14.     GetArguments        dd ?
  15.     SetArguments        dd ?
  16.     GetHotkey           dd ?
  17.     SetHotkey           dd ?
  18.     GetShowCmd          dd ?
  19.     SetShowCmd          dd ?
  20.     GetIconLocation     dd ?
  21.     SetIconLocation     dd ?
  22.     SetRelativePath     dd ?
  23.     Resolve             dd ?
  24.     SetPath             dd ?
  25. ends
  26.  
  27. ; IID_IPersistFile Interface
  28. struct IPersistFileDispatch
  29.     QueryInterface      dd ?
  30.     AddRef              dd ?
  31.     Release             dd ?
  32.  
  33.     GetClassID          dd ?
  34.     IsDirty             dd ?
  35.     Load                dd ?
  36.     Save                dd ?
  37.     SaveCompleted       dd ?
  38.     GetCurFile          dd ?
  39. ends
Работа с ярлыком состоит из двух этапов. При создании ярлыка сперва надо назначить все его свойства, затем получить доступ к интерфейсу для работы с файлом ярлыка, а потом сохранить созданный ярлык в файл. Для обратной операции надо получить интерфейс для работы с файлами, прочитать файл ярлыка, а затем узнать его свойства.

Работа с COM-объектами уже неоднократно была описана в предыдущих статьях, так что внимательные читатели не увидят тут ничего нового. Описания методов и их параметры можно посмотреть в документации MSDN: IPersistFile и IShellLinkW.
  1.         ; Инициализировать COM-объект
  2.         invoke  CoInitialize,NULL
  3.  
  4.         ; Создать объект
  5.         invoke  CoCreateInstance,CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,\
  6.                 IID_IShellLinkW,pIShDisp
  7.         cmp     eax,S_OK
  8.         jne     @f
  9.  
  10.         ; Вызвать метод интерфейса QueryInterface
  11.         mov     eax, [pIShDisp]
  12.         mov     eax, [eax]
  13.         stdcall dword [eax+IShellLinkWDispatch.QueryInterface],[pIShDisp],\
  14.                 IID_IPersistFile,pIPFileDisp
  15.         cmp     eax,S_OK
  16.         jne     @f
  17.  
  18.         ; Ссылка на Блокнот
  19.         invoke  GetSystemDirectory,buff,100h
  20.         invoke  lstrcat,buff,fname
  21.  
  22.         ; Вызвать метод интерфейса SetPath - путь запуска
  23.         mov     eax, [pIShDisp]
  24.         mov     eax, [eax]
  25.         stdcall dword [eax+IShellLinkWDispatch.SetPath],[pIShDisp],buff
  26.         cmp     eax,S_OK
  27.         jne     @f
  28.  
  29.         ; Вызвать метод интерфейса SetDescription - комментарий
  30.         mov     eax, [pIShDisp]
  31.         mov     eax, [eax]
  32.         stdcall dword [eax+IShellLinkWDispatch.SetDescription],[pIShDisp],desc
  33.         cmp     eax,S_OK
  34.         jne     @f
  35.  
  36.         ; Вызвать метод интерфейса Save
  37.         mov     eax, [pIPFileDisp]
  38.         mov     eax, [eax]
  39.         stdcall dword [eax+IPersistFileDispatch.Save],[pIPFileDisp],link,FALSE
  40.         cmp     eax,S_OK
  41.         jne     @f
  42.  
  43.         ; Освободить объекты
  44.         mov     eax, [pIShDisp]
  45.         mov     eax, [eax]
  46.         stdcall dword [eax+IShellLinkWDispatch.Release],[pIShDisp]
  47.  
  48.         mov     eax, [pIPFileDisp]
  49.         mov     eax, [eax]
  50.         stdcall dword [eax+IPersistFileDispatch.Release],[pIPFileDisp]
  51.  
  52.         ; Удалить объект
  53.         invoke  CoUninitialize
В приложении пример программы с исходным текстом, которая создает в текущем каталоге ярлык на Блокнот.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Create.Link.Demo.zip (2,059 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 188 | Комментариев: 0

Метки: Assembler

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2020
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0049 сек.) / Память: 4.75 Mb
Наверх