Лекції - Робота з ярликами

Для керування ярликами в Windows використовується COM-клас ShellLink , що має ідентифікатор CLS & IShellLink , який дозволяє отримувати та призначати властивості ярлика, і IPersistFile , призначений (в даному випадку) для читання та запису файлу ярлика.

Інтерфейс IShellLink

Заголовний файл#include
Безпосередній предокінтерфейс IUnknown

Насправді існує дві версії цього інтерфейсу: IShellLinkA і IShellLinkW , останній з яких доступний тільки під Windows NT/2000/XP; яка з версій використовуватиметься залежить від того, в якій конфігурації компілюється додаток — ANSI або Unicode. Нижче наведено методи даного інтерфейсу.

SLGP_SHORTPATH ​​повернути ім'я у форматі 8.3; SLGP_UNCPRIORITY повернути ім'я у форматі UNC (Universal Naming Convention); SLGP_RAWPATH повернути необроблене ім'я (воно, згідно MSDN, є «щось, що може не існувати і може містити імена змінних оточення, замість яких необхідно підставити їх значення»).

Метод може повернути одне з таких значень:

NOERROR успішне виконання, у pszDest скопійовано повний шлях; S_FALSE успішне виконання, але в pszDest записано порожній рядок (це відбувається в тому випадку, коли об'єкту, на який посилається ярлик, не відповідає реальний файл на диску - Recycle Bin, Control Panel, Printers); E_xxx код помилки OLE.

Призначає повне ім'я об'єкта, який посилається даний ярлик, відповідно до параметром pszSrc . Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Призначає аргументи, що передаються об'єкту під час його відкриття, відповідно до рядка pszSrc . Метод повертає значенняNOERROR при успішному виконанні або код помилки OLE — інакше.

Призначає ім'я папки, яка має стати поточною для відкритого об'єкта відповідно до рядка pszSrc . Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

HOTKEYF_CONTROL клавіша Ctrl; HOTKEYF_SHIFT клавіша Shift; HOTKEYF_ALT клавіша Alt; HOTKEYF_EXT розширена кнопка.

Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Призначає "гарячу клавішу", яка використовується для відкриття об'єкта. Молодший байт параметра wSrc повинен містити віртуальний код основної клавіші, а старший — комбінацію прапорів HOTKEYF_xxx, що відповідають клавішам-модифікаторам, можливі значення яких наведені вище. Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

SW_SHOWNORMAL відповідає варіанту Normal window; SW_SHOWMINNOACTIVE відповідає варіанту Minimized; SW_SHOWMAXIMIZED відповідає варіанту Maximized.

Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Призначає команду показу головного вікна об'єкта відповідно до параметра nSrc, можливі значення якого наведені вище. Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Призначає опис ярлика відповідно до рядка pszSrc. Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Призначає для цього ярлика іконку, що міститься у файлі з ім'ям pszSrc і має індекс nIndex. Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Виконуєпошук об'єкта, на який посилається цей ярлик. Параметр hWnd повинен містити дескриптор вікна, поверх якого виводитимуться діалогові вікна для введення додаткової інформації, якщо вона знадобиться системі. Через параметр fdwFlags передається набір прапорів, які визначають параметри пошуку:

SLR_NOSEARCH не використовувати евристичний пошук; SLR_UPDATE якщо об'єкт, на який посилається ярлик, було змінено, необхідно оновити його повне ім'я; SLR_NOUPDATE не оновлювати ярлик у будь-якому випадку; SLR_INVOKE_MSI запустити Microsoft Windows Installer для відновлення об'єкта, на який посилається ярлик, якщо це необхідно; SLR_NO_UI не запитувати додаткову інформацію, якщо об'єкт, на який посилається ярлик, не може бути знайдений (якщо цей прапор встановлений, старше слово параметра fdwFlags може містити максимальний інтервал часу, протягом якого буде виконуватися пошук; значення 0 відповідає інтервалу за замовчуванням 3000 мс).

Метод повертає значення NOERROR при успішному виконанні або код помилки OLE — інакше.

Інтерфейс IPersistFile

Заголовний файл#include
Безпосередній предокінтерфейс IPersist

Цей інтерфейс надає методи для роботи з дисковими файлами.

Відкриває файл з ім'ям pstrFileName та ініціалізує COM-об'єкт даними з цього файлу; параметр fdwMode визначає режим роботи з файлом і може бути комбінацією наступних прапорів:

STGM_READ читання даних; STGM_WRITE запис даних; STGM_READWRITE читання та запис даних; STGM_SHARE_EXCLUSIVE блокувати доступ інших процесів до файлу; STGM_SHARE_DENY_READ блокувати читання файлу іншими процесами; STGM_SHARE_DENY_WRITE блокувати запис у файліншими процесами; STGM_SHARE_DENY_NONE не блокувати іншим процесам доступ до файлу.

Метод може повертати одне з наступних значень:

S_OK успішне виконання; E_OUTOFMEMORY для виконання необхідної операції недостатньо пам'яті; E_FAIL сталася помилка.

Записує дані у файл з ім'ям pstrFileName; якщо параметр fSetCurrent заданий рівним TRUE, то для запису даних у той же файл при наступних викликах методу параметр pstrFileName можна задавати рівним NULL (значення параметра fSetCurrent при цьому ігнорується). Розглянемо простий приклад:

Метод Save повертає значення S_OK при успішному виконанні або E_FAIL у разі помилки.

Метод GetCurFile повертає одне з наступних значень:

S_OK повне ім'я файлу успішно скопійовано; S_FALSE файл не має імені та скопійований рядок є шаблоном виду*.розширення; E_OUTOFMEMORY для виконання необхідної операції недостатньо пам'яті; E_FAIL сталася помилка.

Метод повертає значення S_OK, якщо дані були змінені з моменту останнього збереження файлу, або S_FALSE — інакше.

Читання/зміна існуючого ярлика

Для читання (і можливо зміни) властивостей вже існуючого ярлика необхідно виконати наступну послідовність дій:

  1. Ініціалізувати, якщо це ще не було зроблено, COM-бібліотеку викликом функції CoInitialize (або CoInitializeEx).
  2. Створити за допомогою функції CoCreateInstance екземпляр COM-класу ShellLink і отримати покажчик на його інтерфейс IPersistFile.
  3. Завантажити викликом Load потрібний ярлик, вказавши бажаний режим доступу до його властивостей - читання (STGM_READ), запис (STGM_WRITE) або читання/запис (STGM_READWRITE).
  4. Отримати покажчик на інтерфейсIShellLink "нашого" COM-об'єкта, викликавши метод QueryInterface через отриманий раніше покажчик на IPersistFile .
  5. Якщо існує ймовірність того, що об'єкт, на який посилається ярлик, був переміщений - викликати через отриманий покажчик метод Resolve для пошуку об'єкта.
  6. Отримати та (або) призначити необхідні властивості ярлика, викликавши через покажчик на IShellLink його методи GetXxxx та (або) SetXxxx відповідно.
  7. При необхідності - зберегти зроблені зміни за допомогою методу Save інтерфейсу IPersistFile.
  8. "Відпустити" отримані інтерфейси, викликавши для кожного з них метод Release.
  9. Завершити, якщо це необхідно, роботу з COM-бібліотекою викликом функції CoUninitialize (перед цим можна викликати функцію CoFreeUnusedLibraries для вивантаження з пам'яті всіх COM-серверів, які не використовуються).

Як приклад наведених нижче дій наведено текст функції, яка приймає як параметр ім'я ярлика і виводить на консоль повне ім'я файлу, на який цей ярлик посилається.

Створення нового ярлика

Для створення нового ярлика необхідно виконати такі дії:

  1. Ініціалізувати, якщо це ще не було зроблено, COM-бібліотеку викликом функції CoInitialize (або CoInitializeEx).
  2. Створити за допомогою функції CoCreateInstance екземпляр COM-класу ShellLink та отримати покажчик на його інтерфейс IShellLink.
  3. Призначити викликами відповідних методів SetXxxx отриманого інтерфейсу бажані властивості ярлика.
  4. Отримати покажчик на інтерфейс IPersistFile «нашого» COM-об'єкта, викликавши метод QueryInterface через отриманий раніше покажчик на IShellLink.
  5. Зберегти створений ярлик у файл із заданим ім'ям викликом методу Save.
  6. «Відпустити»отримані інтерфейси, викликавши кожного їх метод Release .
  7. Завершити, якщо це необхідно, роботу з COM-бібліотекою викликом функції CoUninitialize (перед цим можна викликати функцію CoFreeUnusedLibraries для вивантаження з пам'яті всіх COM-серверів, які не використовуються).

Можливий варіант реалізації описаної послідовності дій міститься у методі OnButtonCreate класу CMainDialog з демонстраційного проекту до цієї теми.