Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание виртуальной папки (shell extensions)... несколько вопросов по реализации... 
:(
    Опции темы
davinchi
Дата 8.7.2012, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



Всем привет!
Делаю «shell extensions» под windows 7 x64, которое добавляется «пока» в пространство имен рабочего стола, закрепляется в панели навигации проводника и реализует метод CreateViewObject интерфейса IShellFolder, т.е. отображает форму при открытии виртуальной папки. До этого момента в MSDN было все понятно, а вот далее с реализацией интерфейсов не совсем понятно… 
Первое с чем столкнулся – мне необходимо, чтобы мое расширение существовало в собственном пространстве имен (чтобы не перечисляться в составе рабочего стола или моего компьютера). Делается вроде элементарно – при регистрации СОМ объекта и создании разделов в реестре создаю собственное пространство имен и добавляю GUID объекта в него. Из пространства имен рабочего стола закрепится не проблема, а как собственное пространсво имен добавить в панель навигации проводника и при этом выше папки "Избранное"?

Далее, расширение должно просто показывать несколько виртуальных элементов, каждый из которых по клику открывает в проводнике заданный физический путь. Виртуальные элементы должны быть полностью статичны, т.е. не удаляться, не переименовываться и не иметь никаких меню. Сама виртуальная папка должна всегда открываться с отображением элементов с крупными заначками и их группировкой и эти параметры должны быть не доступны для изменения. Реализовал все это на форме в TListView, но выглядит как-то не гуд, от основной системы отличается, поэтому думаю капнуть глубже и вывести виртуальные элементы через интерейсы. Попробовал капнуть в сторону интерфейсов перечисления элементов и понял, что надо иди за помощью smile 

Подскажите на пальцах, в общих чертах, порядок и т.п.:
- Как перечислить элементы в папке?
- Как сгруппировать элементы и задать названия групп?
- Как задать начальные параметры отображения виртуальной папки и запретить их изменение?
- Как добавить вверху информационную панельку как в папке «Библиотеки»?

В идеале нужен пример, который реализует самые базовые вещи – виртуальную папу и жестким хардкодингом добавляет в нее несколько виртуальных элементов. Может есть у кого рабочий пример под Delphi XE2…
PM   Вверх
Ne1tr1n0
Дата 9.7.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 2
Всего: 8



На исходниках проводился конкурс по Delphi, там как раз одно из заданий было сделать расширение оболочки, реализующее виртуальные папки. Как вариант взять что-нить из ответов участников, есть очень толковые решения.
Кроме того, есть библиотека компонентов Shell+, которая позволяет быстро создавать различные расширения оболочки Windows. Начиная с версии 3.6 позволяет создавать как 32 так и 64-битные расширения.
PM MAIL   Вверх
davinchi
Дата 9.7.2012, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



Ne1tr1n0, спасибо конечно... но на исходниках я был, я оттуда и взял работы за основу, но там не одно задание на Deplhi XE2 под х64 не компилируется, хотя работа Bems'a видимо то что мне нужно...
Shell+ я тоже находил, я так понимаю это платные компоненты? И не факт что они сделают, то что мне нужно...
PM   Вверх
Ne1tr1n0
Дата 9.7.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 2
Всего: 8



На рутрекере можно и бесплатно найти...
PM MAIL   Вверх
Ne1tr1n0
Дата 9.7.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 1.3.2009

Репутация: 2
Всего: 8



А насчет компиляции под x64 - в XE2 надо посмотреть, какие типы используются, и поменять объявления переменных, там есть некоторые отличия например в разрядности некоторых типов данных (Pointer'ы например у тебя будут 64-битные, Integer остался 32-битным, появился NativeInt который при компиляции на 64-битной тачке будет 8-байтным (64 бита), а на 32-битной соответственно 4-байтным (32 бита).
PM MAIL   Вверх
bems
Дата 10.7.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



моё решение компилится под ХЕ2 если поменять порядок полей в константе
Код

const InvariantFormatSettings: TFormatSettings =  // Настройки из LOCALE_INVARIANT
      (CurrencyString: '¤';                       // Захардкодены здесь потому что в Win2k нет LOCALE_INVARIANT
       CurrencyFormat: 0;
       CurrencyDecimals: 2;
       DateSeparator: '/';
       TimeSeparator: ':';
       ListSeparator: ',';
       ShortDateFormat: 'MM/dd/yyyy';
       LongDateFormat: 'dddd, dd MMMM yyyy';
       TimeAMString: 'AM';
       TimePMString: 'PM';
       ShortTimeFormat: 'hh:mm';
       LongTimeFormat: 'hh:mm:ss';
       ShortMonthNames: ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
       LongMonthNames: ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
       ShortDayNames: ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
       LongDayNames: ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
       ThousandSeparator: ',';
       DecimalSeparator: '.';
       TwoDigitYearCenturyWindow: 0;
       NegCurrFormat: 0);

Авторы RTL коварно всё переставили, я не виноват smile
Под х64 тоже компилится, но работу не проверял


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 10.7.2012, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: нет
Всего: 20



<offtop>
Цитата(bems @  10.7.2012,  23:19 Найти цитируемый пост)
Авторы RTL коварно всё переставили, я не виноват

Возможно потому, что призом тогда было изделие MS? smile
</offtop>


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 10.7.2012, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Какая разница что тогда было? Поля в записи переставлены независимо от этого


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 11.7.2012, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: нет
Всего: 20



Цитата(bems @  10.7.2012,  23:56 Найти цитируемый пост)
Поля в записи переставлены

На всякий пожарный случай. 
Скажи что и где изменено в описании структуры.
При возможности укажи и "когда"(в какой версии) изменено.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 11.7.2012, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



northener, новый порядок полей привел выше
Старый: 
Код

const InvariantFormatSettings: TFormatSettings =  // Настройки из LOCALE_INVARIANT
      (CurrencyFormat: 0;                         // Захардкодены здесь потому что в Win2k нет LOCALE_INVARIANT
       NegCurrFormat: 0;
       ThousandSeparator: ',';
       DecimalSeparator: '.';
       CurrencyDecimals: 2;
       DateSeparator: '/';
       TimeSeparator: ':';
       ListSeparator: ',';
       CurrencyString: '¤';
       ShortDateFormat: 'MM/dd/yyyy';
       LongDateFormat: 'dddd, dd MMMM yyyy';
       TimeAMString: 'AM';
       TimePMString: 'PM';
       ShortTimeFormat: 'hh:mm';
       LongTimeFormat: 'hh:mm:ss';
       ShortMonthNames: ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
       LongMonthNames: ('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
       ShortDayNames: ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
       LongDayNames: ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
       TwoDigitYearCenturyWindow: 0);


старый был в 2010 новый в ХЕ2
в какой именно версии поменяли точно не знаю


--------------------
Обижено школьников: 8
PM MAIL   Вверх
davinchi
Дата 11.7.2012, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



bems, рад, что ты заглянул в мою тему... я как раз на твоей работе остановился, у тебя реализация самой фабрики круче всех реализована, блокировки и т.п. все как надо...
А я всю голову сломал с этим InvariantFormatSettings, я даже и подумать не мог что там порядок важен, думал там элементы структуры все-таки по именам сопоставляются, так и не одолел, поставил веде вместо InvariantFormatSettings - UserFormatSettings, в результате виртуальная папка просто не открывается... Попробую поправить описание структуры, о результатах отпишусь...
bems, а при дерегистрации DLL она должна выгружаться или для выгрузки надо убить\запустить explorer? и есть ли возможность прицепиться к загруженной DLL для ее отладки в IDE?


Это сообщение отредактировал(а) davinchi - 11.7.2012, 08:51
PM   Вверх
davinchi
Дата 11.7.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



bems, правка объявления InvariantFormatSettings вернула код модуля "uCollections.pas" в первозданный вид, все свои вышеописанные привки убрал, но дело по-моему не в коллекции... Мои ковыряния показали, что проблема в методе CreateViewObject:
Код
function TFolder.CreateViewObject(hwndOwner: HWND; const riid: TIID; out ppvOut): HResult;
var
 cr: SFV_CREATE;
begin
 Pointer(ppvOut) := nil;
 if not IsEqualGUID(riid, IID_ISHELLVIEW) then Exit(E_NOINTERFACE);

 Result := QueryInterface(IID_ISHELLFOLDER, cr.pshf);
 if Result = S_OK then
  begin
   cr.cbSize := SizeOf(cr);
   Pointer(cr.psvOuter) := nil;
   Pointer(cr.psfvcb) := nil; // На самом деле IShellFolderViewCB не опцилнальный.
   Result := FCollection.QueryInterface(IID_IShellFolderViewCB, cr.psfvcb);
   if Succeeded(Result) // Без него не будет даже реакции на сообщения об изменениях
     then Result := SHCreateShellFolderView(cr, IShellView(ppvOut));
   //MyAdd
   if Succeeded(Result)
    then ShowMessage('CreateViewObject - SHCreateShellFolderView: TRUE')
    else ShowMessage('CreateViewObject - SHCreateShellFolderView: FALSE'); // <- Вот это выводится
  end;
end;

Если SHCreateShellFolderView возвращает S_FALSE это наверное не очень хорошо?
PM   Вверх
bems
Дата 11.7.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(davinchi @  11.7.2012,  08:48 Найти цитируемый пост)
даже и подумать не мог что там порядок важен
компилятор же явно говорит что отличается порядок полей

Цитата(davinchi @  11.7.2012,  08:48 Найти цитируемый пост)
bems, а при дерегистрации DLL она должна выгружаться или для выгрузки надо убить\запустить explorer?
должно выгружаться, но практика показывает что этого не происходит. При  этом моя реализация DllCanUnloadNow возвращает S_OK, так что думаю просто винда откладывает выгрузку

Цитата(davinchi @  11.7.2012,  08:48 Найти цитируемый пост)
есть ли возможность прицепиться к загруженной DLL для ее отладки в IDE?
Attach to process

Цитата(davinchi @  11.7.2012,  10:21 Найти цитируемый пост)
Если SHCreateShellFolderView возвращает S_FALSE это наверное не очень хорошо? 
да, это плохо



--------------------
Обижено школьников: 8
PM MAIL   Вверх
davinchi
Дата 12.7.2012, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



bems, 
Цитата(bems @  11.7.2012,  18:01 Найти цитируемый пост)
компилятор же явно говорит что отличается порядок полей

мне компилятор говорил "type mismatch", ну да и ладно, проехали уже...
Цитата(bems @  11.7.2012,  18:01 Найти цитируемый пост)
должно выгружаться, но практика показывает что этого не происходит. При  этом моя реализация DllCanUnloadNow возвращает S_OK, так что думаю просто винда откладывает выгрузку

да, непонятно как-то, я бы даже сказал что может выгрузить, а может и не выгрузить, от чего зависит непонятно...
Цитата(bems @  11.7.2012,  18:01 Найти цитируемый пост)
Attach to process

это понятно, а к какому процессу цепляться?
Цитата(bems @  11.7.2012,  18:01 Найти цитируемый пост)
да, это плохо

да, плохо, и происходит это по тому, что в win7 для успешного выполнения SHCreateShellFolderView надо чтобы был реализован интерфейс IPersistFolder2, реализующий метод GetCurFolder...
вот ломаю голову, как его прикрутить...
PM   Вверх
bems
Дата 12.7.2012, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(davinchi @  12.7.2012,  09:24 Найти цитируемый пост)
это понятно, а к какому процессу цепляться?

explorer.exe
но практика вчера показала что дельфи при таком аттаче не может подцепить исходники дллки, а отдним CPU сыт не будешь
Решения пока не нашел

Цитата(davinchi @  12.7.2012,  09:24 Найти цитируемый пост)
да, плохо, и происходит это по тому, что в win7 для успешного выполнения SHCreateShellFolderView надо чтобы был реализован интерфейс IPersistFolder2, реализующий метод GetCurFolder...

да, похоже на то. попробую прикрутить



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.