Как программно создать ярлык
Ярлыки - одна из ключевых сущностей Windows. Это специальные файлы, служащие указателями на папки, программы или команды. Для управления ярлыками в Windows используется COM-объект ShellLink, точнее одна версия для ANSI и вторая для юникода. Они отличаются своими GUID. В любом из этих объектов реализовано по два интерфейса. Интерфейс IShellLink, с помощью которого можно получать и изменять свойства ярлыка, и интерфейс IPersistFile для работы непосредственно с самим файлом ярлыка.Для доступа к COM-объектам первым делом надо обозначить их GUID:
Code (Assembler) : Убрать нумерацию
- ; GUID {00021401-0000-0000-C000-000000000046}
- CLSID_ShellLink dd 00021401h
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {000214F9-0000-0000-C000-000000000046}
- IID_IShellLinkW dd 000214F9h
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {0000010B-0000-0000-C000-000000000046}
- IID_IPersistFile dd 0000010Bh
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
Code (Assembler) : Убрать нумерацию
- ; IID_IShellLinkW Interface
- struct IShellLinkWDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetPath dd ?
- GetIDList dd ?
- SetIDList dd ?
- GetDescription dd ?
- SetDescription dd ?
- GetWorkingDirectory dd ?
- SetWorkingDirectory dd ?
- GetArguments dd ?
- SetArguments dd ?
- GetHotkey dd ?
- SetHotkey dd ?
- GetShowCmd dd ?
- SetShowCmd dd ?
- GetIconLocation dd ?
- SetIconLocation dd ?
- SetRelativePath dd ?
- Resolve dd ?
- SetPath dd ?
- ends
- ; IID_IPersistFile Interface
- struct IPersistFileDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetClassID dd ?
- IsDirty dd ?
- Load dd ?
- Save dd ?
- SaveCompleted dd ?
- GetCurFile dd ?
- ends
Работа с COM-объектами уже неоднократно была описана в предыдущих статьях, так что внимательные читатели не увидят тут ничего нового. Описания методов и их параметры можно посмотреть в документации MSDN: IPersistFile и IShellLinkW.
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Создать объект
- invoke CoCreateInstance,CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,\
- IID_IShellLinkW,pIShDisp
- cmp eax,S_OK
- jne @f
- ; Вызвать метод интерфейса QueryInterface
- mov eax, [pIShDisp]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkWDispatch.QueryInterface],[pIShDisp],\
- IID_IPersistFile,pIPFileDisp
- cmp eax,S_OK
- jne @f
- ; Ссылка на Блокнот
- invoke GetSystemDirectory,buff,100h
- invoke lstrcat,buff,fname
- ; Вызвать метод интерфейса SetPath - путь запуска
- mov eax, [pIShDisp]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkWDispatch.SetPath],[pIShDisp],buff
- cmp eax,S_OK
- jne @f
- ; Вызвать метод интерфейса SetDescription - комментарий
- mov eax, [pIShDisp]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkWDispatch.SetDescription],[pIShDisp],desc
- cmp eax,S_OK
- jne @f
- ; Вызвать метод интерфейса Save
- mov eax, [pIPFileDisp]
- mov eax, [eax]
- stdcall dword [eax+IPersistFileDispatch.Save],[pIPFileDisp],link,FALSE
- cmp eax,S_OK
- jne @f
- ; Освободить объекты
- mov eax, [pIShDisp]
- mov eax, [eax]
- stdcall dword [eax+IShellLinkWDispatch.Release],[pIShDisp]
- mov eax, [pIPFileDisp]
- mov eax, [eax]
- stdcall dword [eax+IPersistFileDispatch.Release],[pIPFileDisp]
- ; Удалить объект
- invoke CoUninitialize
Просмотров: 1253 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария