Работа с ярлыками |
Общие замечанияДля управления ярлыками в Windows используется COM-класс ShellLink, имеющий идентификатор CLSID_ShellLink и реализующий два интерфейса: IShellLink, который позволяет получать и назначать свойства ярлыка, и IPersistFile, предназначенный (в данном случае) для чтения и записи файла ярлыка. Интерфейс IShellLink
В действительности, существует две версии этого интерфейса: IShellLinkA и IShellLinkW, последний из которых доступен только под Windows NT/2000/XP; какая из версий будет использоваться зависит от того, в какой конфигурации компилируется приложение — ANSI или Unicode. Ниже перечислены методы данного интерфейса. HRESULT GetPath( LPTSTR pszDest, int cchMax, WIN32_FIND_DATA* pwfd, DWORD fdwFlags ); Копирует в буфер по адресу pszDest размером cchMax символов полное имя объекта, на который ссылается данный ярлык, и записывает в структуру, адресуемую параметром pwfd, атрибуты этого объекта. В качестве параметра fdwFlags может быть указана комбинация следующих флагов:
Метод может вернуть одно из следующих значений:
HRESULT SetPath( LPCTSTR pszSrc ); Назначает полное имя объекта, на который ссылается данный ярлык, в соответствии с параметром pszSrc. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT GetArguments( LPTSTR pszDest, int cchMax ); Копирует в буфер по адресу pszDest размером cchMax символов аргументы, передаваемые объекту при его открытии (эти аргументы задаются в свойствах ярлыка на вкладке Shortcut в поле ввода Target вслед за именем объекта). Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT SetArguments( LPCTSTR pszSrc ); Назначает аргументы, передаваемые объекту при его открытии, в соответствии со строкой pszSrc. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT GetWorkingDirectory( LPTSTR pszDest, int cchMax ); Копирует в буфер по адресу pszDest размером cchMax символов имя папки, которая должна стать текущей для открытого объекта (это имя задается в свойствах ярлыка на вкладке Shortcut в поле ввода Start in). Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT SetWorkingDirectory( LPCTSTR pszSrc ); Назначает имя папки, которая должна стать текущей для открытого объекта, в соответствии со строкой pszSrc. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT GetHotKey( WORD* pwDest ); Копирует в переменную по адресу pwDest «горячую клавишу», используемую для открытия объекта (это сочетание клавиш задается в свойствах ярлыка на вкладке Shortcut в поле Shortcut key). Младший байт скопированного значения содержит виртуальный код основной клавиши (VK_xxx), а старший байт — комбинацию флагов, соответствующих клавишам-модификаторам:
Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT SetHotKey( WORD wSrc ); Назначает «горячую клавишу», используемую для открытия объекта. Младший байт параметра wSrc должен содержать виртуальный код основной клавиши, а старший — комбинацию флагов HOTKEYF_xxx, соответствующих клавишам-модификаторам, возможные значения которых приведены выше. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT GetShowCmd( int* pnDest ); Записывает в переменную по адресу pnDest команду показа главного окна объекта (вариант отображения главного окна выбирается в свойствах ярлыка на вкладке Shortcut из списка Run). Возможно одно из следующих значений:
Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT SetShowCmd( int nSrc ); Назначает команду показа главного окна объекта в соответствии с параметром nSrc, возможные значения которого приведены выше. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT GetDescription( LPTSTR pszDest, int cchMax ); Копирует в буфер по адресу pszDest размером cchMax символов описание ярлыка (под Windows 2000/XP оно задается в свойствах ярлыка на вкладке Shortcut в поле ввода Comment и отображается при наведении курсора мышки на ярлык). Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT SetDescription( LPCTSTR pszSrc ); Назначает описание ярлыка в соответствии со строкой pszSrc. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT GetIconLocation( LPTSTR pszDest, int cchMax, int* pnIndex ); Копирует в буфер по адресу pszDest размером cchMax символов полное имя файла, содержащего иконку для данного ярлыка, а в переменную по адресу pnIndex — индекс иконки в этом файле, начиная с 0. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT SetIconLocation( LPCTSTR pszSrc, int nIndex ); Назначает для данного ярлыка иконку, содержащуюся в файле с именем pszSrc и имеющую индекс nIndex. Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. HRESULT Resolve( HWND hWnd, DWORD fdwFlags ); Выполняет поиск объекта, на который ссылается данный ярлык. Параметр hWnd должен содержать дескриптор окна, поверх которого будут выводиться диалоговые окна для ввода дополнительной информации, если она понадобится системе. Через параметр fdwFlags передается набор флагов, определяющих параметры поиска:
Метод возвращает значение NOERROR при успешном выполнении или код ошибки OLE — в противном случае. Интерфейс IPersistFile
Этот интерфейс предоставляет методы, предназначенные для работы с дисковыми файлами. HRESULT Load( LPCOLESTR pstrFileName, DWORD fdwMode ); Открывает файл с именем pstrFileName и инициализирует COM-объект данными из этого файла; параметр fdwMode определяет режим работы с файлом и может быть комбинацией следующих флагов:
Метод может возвращать одно из следующих значений:
HRESULT Save( LPCOLESTR pstrFileName, BOOL fSetCurrent ); Записывает данные в файл с именем pstrFileName; если параметр fSetCurrent задан равным TRUE, то для записи данных в тот же самый файл при следующих вызовах метода параметр pstrFileName можно задавать равным NULL (значение параметра fSetCurrent при этом игнорируется). Рассмотрим простой пример:
Метод Save возвращает значение S_OK при успешном выполнении или E_FAIL — в случае ошибки. HRESULT GetCurFile( LPOLESTR* ppstrDest, ); Выделяет с помощью интерфейса IMalloc блок памяти, копирует в него полное имя файла, который COM-объект использует для чтения/записи данных, и записывает адрес выделенного блока в переменную по адресу ppstrDest. Освобождение этого блока памяти должно выполняться приложением-клиентом. Пример использования:
Метод GetCurFile возвращает одно из следующих значений:
HRESULT IsDirty(void);
Метод возвращает значение S_OK, если данные были изменены с момента последнего сохранения файла, или S_FALSE — в противном случае. Чтение/изменение существующего ярлыкаДля чтения (и возможно — изменения) свойств уже существующего ярлыка необходимо выполнить следующую последовательность действий:
В качестве примера перечисленных действий ниже приведен текст функции, которая принимает в качестве параметра имя ярлыка и выводит на консоль полное имя файла, на который этот ярлык ссылается.
Создание нового ярлыкаДля создания нового ярлыка необходимо выполнить следующие действия:
Возможный вариант реализации описанной последовательности действий содержится в методе OnButtonCreate класса CMainDialog из демонстрационного проекта к данной теме. | ||||||||