![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Не подскажите, как сделать, чтобы в WinXP зарегистрировать новый тип фалов (графический), чтобы в проводнике при выделение файла данного типа в свойствах был виден его предпросмотр, как это организовано со всеми стандартными типами файлов?
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| Unregistered |
|
|||
|
Unregistered |
Интерфейс IExtractImage для пердварительного просмотра в Проводнике.
Интерфейс IShellPropSheetExt для создания страниц свойств. Или достань Shell+. Там есть пробник. Но только на 30 дней. |
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Хочется своими руками дописать всё.... Можно попобробнее остановиться на IExtractImage и IShellPropSheetExt? Не общими фразами, а хоть небольшие краткие примеры?..
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| Cheba |
|
|||
![]() pointless one ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 1777 Регистрация: 27.11.2003 Где: /dev/null Репутация: 1 Всего: 62 |
Могу накидать про IShellPropSheetExt. С другим не приходилось работать.
|
|||
|
||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Очень был бы признателен! Хотя бы на этом примере разобраться... кинь на мыло, если не составит труда: illusdolphin@!yandex.ru ("!" не нужен - antispam : )) -------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| Cheba |
|
||||||||||||||||||||||||||||||||||||
![]() pointless one ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 1777 Регистрация: 27.11.2003 Где: /dev/null Репутация: 1 Всего: 62 |
Добавление вкладок в диалоговое окно свойств файла
Вступление (поскипано, бо не важно) Как это работает При формировании диалогового окна свойств файла оболочка Windoze выполняет следующие действия. 1) Ищет в реестре раздел HKEY_CLASSES_ROOT\.ext, где .ext расширение файла. 2) Считывакт оттуда значение, заданное по умолчанию, например, для расширения .txt в нем задана строка textfile. 3) Ищет в секции HKEY_CLASSES_ROOT раздел, совпадающий по имени со значением, полученным в п. 2. 4) В этом разделе проверяет раздел shellext\PropertySheetHandlers 5) Если такой подраздел существует, то из него считываются значения идентификаторов GUIDE для COM-серверов. 6) Оболочка предполагает, что эти серверы реализуют интерфейсы IShellExtInit, IShellPropSheetExt. Она создает экземпляры СОМ-объектов, запрашивая у них эти интерфейсы и при помощи их методов позволяет добавить в дилоговое окно свойств файла страницы. Чтобы понять, как это происходит, рассмотрим подробнее методы используемых интерфейсов:
Единственный метод этого интерфейса вызывается оболочкой для инициализациирасширений и служит для передачи в него контекста, в которомВ вызвано расширение (текущая папка, выбранный объект). Параметр pidlFolder для диалога всегда содержит nil, а в параметре lpdobj передается ссылка на интерфейс IDataObject, при помощи которого можно получить информацию об объекте, для которого вызвано расширение оболочки.
Второй из используемых интерфейсов характерен только для обработчика диалогового окна свойств и содержит методы, добавлить страницы в диалоговое окно либо заменить уже имеющиеся там новыми. Нам понадобится только первый метод, поскольку второй используется для страниц Панели управления Windoze. В метод AddPages передются два параметра.
Таким образом, для создания своих вкладок необходимо выполнить следующую процедуру. 1. В методе IShellExtInit.Initialize получить и запомнить имя файла, для которого требуется показать показать страницы свойств. 2. В методе IShellPropSheetExt.AddPages - создать и добавитьтребуемы е страницы. Функция LpfnAddPage имеет следующий тип:
параметр lParam нам передают. Параметр HPSP мы должны получить при помощи функции:
Эта функция принимает на входе структуру PSP, объявленную как:
От приложения требуется корректно заполнить требуемые поля структуры.
Как можно заметить, описание страницы берется из ресурса, а за ее поведение отвечает функция pfnDlgProc. Это несколько не привычно для программистаDelphi, но имноо таким образом осуществляется создание диалоговых окон в WinAPI. Впрочем, все не так уж сложно, и программист, знакомый с сообщениями Windows и оконной процедурой, легко сможет понять, как создавать свои диалоговые окна. На этом вводную часть можно считать оконченной и можно приступить к реализаци. Создание СОМ-сервера Расширение оболочки - это внутрипроцессный СОМ-сервер, скомпилированный в DLL. Чтобы создать, эго следует выбрать в меню Delphi команду File > New > Other, перейти на страницу ActiveX репозитория объектов и выбрать значок ActiveX Library. Будет создана библиотека. Затем на той же странице нужно выбрать значок COM Object. В появившемся окне следует ввести имя создаваемого класса (например TTextProp) и снять флажок Include Type Library. Будет сгенерирован шаблон СОМ-сервера. Теперь добавим в секцию uses модуль ShlObj, в котором объявлены требуемые интерфейсы, и добавим их в описание класса. Также добавим поле FileName для хранения имени файла, с которым нам придется работать. После этого объявление класс должно выглядеть следующим образом:
Можно приступать к реализации методов. Метод Initialize взят из примера Contmenu.dpr, входящего в комплект поставки Delphi, метод ReplacePage не делает ничего, кроме возвращения кода успешного завершения. Таким образом, наиболее интересен код метода AddPages:
Как видим, сам по себе метод несложен, но в его коде есть один тонкий момент. Дело в том, что оболочка Windows после вызова этого метода «отпускает» СОМ-сервер, вызывая его метод IUnknown._Release, что приводит к его немедленному разрушению и выгрузке DLL из памяти. Однако это явно не входит в наши планы, а поэтому мы должны проделать описанную ниже процедуру. 1. Принудительно увеличить счетчик ссылок вызовом метода _AddRef. 2. По завершении работы с диалоговым окном вызвать метод _Release для освобождения памяти. 3. Запомнить где-то ссылку на себя и сохранять ее до конца работы (чтобы вызвать метод _Release впоследствии). Ссылка запоминается в поле lParam структуры TPropSheetPage. В дальнейшем это поле будет передано в диалоговую процедуру, и мы сможем сохранить ссылку. ВНИМАНИЕ Это редчайший случай прямого вмешательства в механизм автоматического управления подсчетом интерфейсных ссылок. Без веских на то оснований вызывать методы AddRef и Release не надо. Создание описания диалогового окна и диалоговой функции Как мы уже ранее упоминали, описание диалогового окна должно храниться в файле ресурсов программы. Для этого необходимо создать ресурс типа DIALOGEX (файл sheet.rc) и подключить его к проекту. Кроме того, нам понадобится модуль с описаниями констант следующего содержания:
В самом файле ресурсов надо добавить следующее описание диалогового окна:
Как видите, описание диалогового окна достаточно просто и очевидно. Диалоговое окно будет содержать мемо-поле и кнопку. Более подробно о языке описания ресурсов можно узнать из документации Windows SDK. Однако это лишь описание расположения элементов управления на форме. От нас требуется написать код, обеспечивающий функциональность диалогового окна. Этот код расположен в функции DialogProc, которая вызывается каждый раз, когда нашему окну приходит сообщение. К счастью, нет необходимости обрабатывать все сообщения Windows (для этого существует функция DefWindowProc), необходимо лишь описать специфическую функциональность, нужную нам.
Сообщение WM_INITDIALOG приходит при создании страницы. В поле lParam хранится значение, которое передается в TPropSheetPag.lParam. Для сохранения ссылки на объект TTextProp воспользуемся возможностью поставить в соответствие любому окну произвольное число. Его можно записать вызовом функции SetWindowLong с параметром DWL_USER, а получить - вызовом функции GetWindowLong. Кроме этого мы отправляем сами себе сообщение WM_CREATED с помощью функции PostMessage. Это гарантирует, что оно придет после полного завершения инициализации окна.
Окно полностью проинициализировано, корректируем координаты элементов управления, чтобы они располагались корректно вне зависимости от разрешения и установленного шрифта:
Сообщение WM_COMMAND приходит каждый раз, когда пользователь выбирает в окне какой-то элемент управления. Мы обрабатываем только одну команду - по щелчку на кнопке загружаем в многострочное поле первый килобайт файла:
Сообщение WM_DESTROY приходит при уничтожении окна. Освобождаем ранее выделенную память и позволяем выгрузиться нашему СОМ-серверу:
Все остальные сообщения передаются в процедуру обработки, предоставленную Windows API:
Как видите, создание диалогового окна средствами API - не такая уж сложная задача. Регистрация расширения оболочки Наше приложение, которое является СОМ-сервером, должно прописать в реестре дополнительную информацию о том, к какому расширению файла оно относится. Удобно делать это одновременно с регистрацией СОМ-сервера. Как известно, регистрация осуществляется вызовами функций DllRegisterServer и DllUnregisterServer, которые Delphi предоставляет автоматически. Однако мы можем вмешаться в этот процесс и дополнить их функциональность. Для этого откроем файл проекта и модифицируем его. Вначале определим константы, чтобы полученный код было легко модифицировать:
В функции DllRegisterServer после успешной регистрации сервера функцией из модуля ComServ проверим наличие в реестре требуемых ключей и при необходимости добавим их:
В функции DllUnregisterServer удалим ненужный ключ с регистрацией расширения оболочки:
Осталось зарегистрировать расширение в Windows. На компьютере разработчика для этого можно воспользоваться командой Run > Register ActiveX Server, на компьютере клиента - утилитой RegSvr32 из состава Windows или TRegSvr из комплекта поставки Delphi. После регистрации программы выберите в Проводнике Windows файл с расширением *.txt и посмотрите его свойства. Полные исходные тексты расширения оболочки приведены на прилагаемом компакт-диске. Заключение (поскипан, бо напрямую к обсуждаемому вопроу не отностся) 2 Vit Простите за оффтоп, но очень жаль, что вы так и не установили подсветку синтаксися. |
||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||
| Illusion Dolphin |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1198 Регистрация: 3.5.2003 Репутация: 36 Всего: 63 |
Большое спасибо!!! Попробую сделать...
-------------------- В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен. Шифрование и организация фотографий - Photo Database 4.5 |
|||
|
||||
| yDa5HuK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 24.11.2006 Репутация: нет Всего: нет |
это код для игры в шахматы, компилятор выдает ошибку: 4 use the format CODE=dddd, HEAP=dddd or ERRORLEVEL=d. Версия PROLOG 3.3 Заранее всех благодарю. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |