![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
Всем привет!
Делаю «shell extensions» под windows 7 x64, которое добавляется «пока» в пространство имен рабочего стола, закрепляется в панели навигации проводника и реализует метод CreateViewObject интерфейса IShellFolder, т.е. отображает форму при открытии виртуальной папки. До этого момента в MSDN было все понятно, а вот далее с реализацией интерфейсов не совсем понятно… Первое с чем столкнулся – мне необходимо, чтобы мое расширение существовало в собственном пространстве имен (чтобы не перечисляться в составе рабочего стола или моего компьютера). Делается вроде элементарно – при регистрации СОМ объекта и создании разделов в реестре создаю собственное пространство имен и добавляю GUID объекта в него. Из пространства имен рабочего стола закрепится не проблема, а как собственное пространсво имен добавить в панель навигации проводника и при этом выше папки "Избранное"? Далее, расширение должно просто показывать несколько виртуальных элементов, каждый из которых по клику открывает в проводнике заданный физический путь. Виртуальные элементы должны быть полностью статичны, т.е. не удаляться, не переименовываться и не иметь никаких меню. Сама виртуальная папка должна всегда открываться с отображением элементов с крупными заначками и их группировкой и эти параметры должны быть не доступны для изменения. Реализовал все это на форме в TListView, но выглядит как-то не гуд, от основной системы отличается, поэтому думаю капнуть глубже и вывести виртуальные элементы через интерейсы. Попробовал капнуть в сторону интерфейсов перечисления элементов и понял, что надо иди за помощью Подскажите на пальцах, в общих чертах, порядок и т.п.: - Как перечислить элементы в папке? - Как сгруппировать элементы и задать названия групп? - Как задать начальные параметры отображения виртуальной папки и запретить их изменение? - Как добавить вверху информационную панельку как в папке «Библиотеки»? В идеале нужен пример, который реализует самые базовые вещи – виртуальную папу и жестким хардкодингом добавляет в нее несколько виртуальных элементов. Может есть у кого рабочий пример под Delphi XE2… |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 2 Всего: 8 |
На исходниках проводился конкурс по Delphi, там как раз одно из заданий было сделать расширение оболочки, реализующее виртуальные папки. Как вариант взять что-нить из ответов участников, есть очень толковые решения.
Кроме того, есть библиотека компонентов Shell+, которая позволяет быстро создавать различные расширения оболочки Windows. Начиная с версии 3.6 позволяет создавать как 32 так и 64-битные расширения. |
|||
|
||||
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
Ne1tr1n0, спасибо конечно... но на исходниках я был, я оттуда и взял работы за основу, но там не одно задание на Deplhi XE2 под х64 не компилируется, хотя работа Bems'a видимо то что мне нужно...
Shell+ я тоже находил, я так понимаю это платные компоненты? И не факт что они сделают, то что мне нужно... |
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 2 Всего: 8 |
На рутрекере можно и бесплатно найти...
|
|||
|
||||
| Ne1tr1n0 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 120 Регистрация: 1.3.2009 Репутация: 2 Всего: 8 |
А насчет компиляции под x64 - в XE2 надо посмотреть, какие типы используются, и поменять объявления переменных, там есть некоторые отличия например в разрядности некоторых типов данных (Pointer'ы например у тебя будут 64-битные, Integer остался 32-битным, появился NativeInt который при компиляции на 64-битной тачке будет 8-байтным (64 бита), а на 32-битной соответственно 4-байтным (32 бита).
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
моё решение компилится под ХЕ2 если поменять порядок полей в константе
Авторы RTL коварно всё переставили, я не виноват Под х64 тоже компилится, но работу не проверял -------------------- Обижено школьников: 8 |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
<offtop>
Возможно потому, что призом тогда было изделие MS? </offtop> -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Какая разница что тогда было? Поля в записи переставлены независимо от этого
-------------------- Обижено школьников: 8 |
|||
|
||||
| northener |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1361 Регистрация: 2.9.2010 Репутация: нет Всего: 20 |
На всякий пожарный случай. Скажи что и где изменено в описании структуры. При возможности укажи и "когда"(в какой версии) изменено. -------------------- Но только лошади летают вдохновенно. Иначе лошади разбились бы мгновенно! |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
northener, новый порядок полей привел выше
Старый:
старый был в 2010 новый в ХЕ2 в какой именно версии поменяли точно не знаю -------------------- Обижено школьников: 8 |
|||
|
||||
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
bems, рад, что ты заглянул в мою тему... я как раз на твоей работе остановился, у тебя реализация самой фабрики круче всех реализована, блокировки и т.п. все как надо...
А я всю голову сломал с этим InvariantFormatSettings, я даже и подумать не мог что там порядок важен, думал там элементы структуры все-таки по именам сопоставляются, так и не одолел, поставил веде вместо InvariantFormatSettings - UserFormatSettings, в результате виртуальная папка просто не открывается... Попробую поправить описание структуры, о результатах отпишусь... bems, а при дерегистрации DLL она должна выгружаться или для выгрузки надо убить\запустить explorer? и есть ли возможность прицепиться к загруженной DLL для ее отладки в IDE? Это сообщение отредактировал(а) davinchi - 11.7.2012, 08:51 |
|||
|
||||
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
bems, правка объявления InvariantFormatSettings вернула код модуля "uCollections.pas" в первозданный вид, все свои вышеописанные привки убрал, но дело по-моему не в коллекции... Мои ковыряния показали, что проблема в методе CreateViewObject:
Если SHCreateShellFolderView возвращает S_FALSE это наверное не очень хорошо? |
|||
|
||||
| bems |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
компилятор же явно говорит что отличается порядок полей
-------------------- Обижено школьников: 8 |
||||||
|
|||||||
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
bems,
мне компилятор говорил "type mismatch", ну да и ладно, проехали уже... да, непонятно как-то, я бы даже сказал что может выгрузить, а может и не выгрузить, от чего зависит непонятно... это понятно, а к какому процессу цепляться? да, плохо, и происходит это по тому, что в win7 для успешного выполнения SHCreateShellFolderView надо чтобы был реализован интерфейс IPersistFolder2, реализующий метод GetCurFolder... вот ломаю голову, как его прикрутить... |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
explorer.exe но практика вчера показала что дельфи при таком аттаче не может подцепить исходники дллки, а отдним CPU сыт не будешь Решения пока не нашел да, похоже на то. попробую прикрутить -------------------- Обижено школьников: 8 |
|||
|
||||
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
bems,
ага, и я о том же... я тебе таааак благодарен буду если сделаешь рабочий пример под семерку х64, с жескозахардкоденными итемами... а то сразу еще и в реализацию итемов через коллекцию тяжело въехать... Это сообщение отредактировал(а) davinchi - 12.7.2012, 11:21 |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Мне не удалось заставить отладчик подцепить отладочную информацию, поэтому я воспользовался пунктом меню Load process
в дереве слева выбирал local, в строке process указал путь к проводнику C:\Windows\explorer.exe в source path указал папку с проектом теперь можно отлаживать, предварительно прибивши дефолтный проводник из таск менеджера Касательно интерфейса IPersistFolder2, я сделал такую реализацию метода:
потом в процессе отладки выяснилось, что когда оболочки запрашивает заголовки колонок (вызов GetDetailsOf с pidl = nil) у меня еще нет этой информации, я возвращаю ошибку и отображение папки наламывается. Видимо в ХР порядок вызовов был другим и такая ситуация не возникала. Чтобы исправить это, я изменил таким образом:
Теперь папка открывается, но при выборе элемента падает с эксцепшном. Дебажу дальше Это сообщение отредактировал(а) bems - 14.7.2012, 06:20 -------------------- Обижено школьников: 8 |
||||
|
|||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
Не хватало IsMultithread := True; в дпр-файле
больше не падет -------------------- Обижено школьников: 8 |
|||
|
||||
| davinchi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 3.3.2010 Репутация: нет Всего: нет |
bems, спасибо! папка открылась, но при смене фокуса от одного итема к другому explorer падает...
и как итемам задать иконки и реакцию на клик? Это сообщение отредактировал(а) davinchi - 15.7.2012, 16:56 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
это уже с IsMultithread := True ? реализовать IContextMenu с действиями по умолчанию (CMF_DEFAULTONLY) -------------------- Обижено школьников: 8 |
|||
|
||||
| crazynetwork |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.10.2009 Репутация: нет Всего: нет |
В этих библиотеках есть компонент TSxChangeNotifier. Он следит за изменениями файлов в папках. Кто знает как его заставить следить и за папками тоже?? |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |