Вчимося програмно створювати ярлики, vr-online - безкоштовний електронний журнал для всіх

Звідки в цьому меню беруться ярлики

Перед тим як зануритися в нетрі кодинга розглянемо невелику теоретичну частину і дізнаємося, звідки взагалі береться список ярликів, які відображаються в пункті "відправити". Отже, пункт меню "відправити" представляє з себе звичайну папку, розташовану в твоєму профілі (тобто \ document and settengs \\ sendto).







А як це зробити красиво

Так, скопіювати свій додаток в цю папку - справа проста і навряд чи вимагає пояснень. Ось тільки, на жаль, це рішення не можна назвати красивим. Чому? Все ж працює! Так, працює, але ті ж цвяхи можна забивати плоскогубцями, а можна молотком. Погодься, останнім інструментом це робити зручніше? Ми знаходимося в точно такій же ситуації. Або будемо робити все по-гангстерськи (тобто копіювати свою програму в цю папку), або дотримуватися правил.

За правилами, в цій папці повинні зберігатися лише ярлики. Про жодні виконуваних файлах ніякої мови і бути не може. Я не знаю, чи вмієш ти створювати ярлики програмно чи ні, але буквально через 15 хвилин ти точно цього навчишся!

Вчимося програмно створювати ярлики, vr-online - безкоштовний електронний журнал для всіх

Лістинг 1: Клас для швидкого створення ярликів

Лістинг 2: Приклад використання

Лістинг 3: Приклад обробки переданих параметрів

Лістинг 4: Список всіх можливих констант, що визначають спец папки

Коду вийшло досить мало і складного в ньому нічого немає. Єдине, з чим у тебе могли виникнути проблеми - невідомі функції. Ось про них ми зараз і поговоримо. Почнемо з CreateComObject.

Функція CreateComObject описана в модулі ComObj. За допомогою неї створюється об'єкт класу, пов'язаний з ідентифікатором класу переданим в якості параметра. У прикладі я передаю CLSID_ShellLink. CLSID_ShellLink - це і є ідентифікатор класу, який представляє з себе звичайний GUID. Якщо говорити стосовно Delphi, то ідентифікатор відповідає типу TGUID. Можеш відкрити модуль ShlObj і спробувати пошукати в ньому текст по CLSID_ShellLink. Не встигнеш вбити, значення як натрапиш на приблизно такий текст:







Якщо функція CreateComObject виконається успішно, то вона поверне посилання на ідентифікатор інтерфейсу типу IUnknown. Сподіваюся, загальну ідею ти вловив. Рухаємо далі.

Отримавши посилання на інтерфейс, тип IUnknown, ми можемо ініціювати наші змінні типу ISheellLink і IPersistFile. Зверни увагу, ім'я типу цих змінних починається з буквою I, тобто цей тип є інтерфейсом. Щоб привести IUnknown до IShellLink я використовую конструкцію: IObject as IShellLink. Що тут робить "as"? Відкрий будь-яку книгу по Delphi і там, в розділі опису основ нюансів ООП цей оператор обов'язково згадується. Обламує копатися в хелпе? Тоді просто дивлячись на слово "as" представляй в голові "як". Тобто умовно вищенаведену конструкцію можна прочитати так: вважати IObject як IShellLink. Тепер зрозуміло? Ок!

Всі необхідні змінні ініціалізовані, тепер перейдемо до створення самого ярлика. Для цього, потрібно попрацювати з інтерфейсом IShellLink виконавши кілька його функцій:

- SetPath - Шлях до додатка, для якого створюється ярлик. Ми передаємо сюди шлях до нашого додатком, який отримуємо за допомогою функції (ParamStr (0)).

- SetWorkingDirectory (); - Робоча папка. Тут думаю і так все повинно бути ясно. Робочу папку отримуємо традиційним ExtractFilePath ().

Виконавши попередні функції, ми створимо скелет ярлика. Залишається лише отримати шлях до спец папці (в нашому випадку "Відправити"). Вирішити це завдання нам допоможуть дві функції:

- SHGetSpecialFolderLocation - повертає покажчик на структуру ITEMIDLIST, що містить інформацію про спеціальні папках. Ця функція приймає три параметри:
1). hWndOwner - зарезірвірован.
2). nFolder - ідентифікатор папки, шлях до якої хочемо отримати.
3). ppidl - покажчик на PItemIDList.

Після виконання функції, в змінної InFolder (її ми передаємо в другому параметрі) буде знаходиться шлях до спеціальній папці. Для зручності, я видирав цей шлях в змінну LinkName, попередньо оформивши за допомогою функції Format. Знаючи шлях до системної папці (нагадаю, в нашому випадку це "Відправити") ні що нам не заважає остаточно створити ярлик. Робиться це за допомогою функції Save інтерфейсу IPersistFile. Все, наш ярлик готовий!

Спробуй запустити приклад і зробити тест. Натиснувши на одну єдину кнопку, ти створиш ярлик в папці "Відправити". Класно? А головне все просто! Заради інтересу, передай методу нашого класу інший ідентифікатор системній папці (див. Третій лістинг), запусти додаток і знову кликни на кнопку. Результат не змусить себе чекати - в зазначеній тобою папці з'явиться ярлик на твоє додаток.