Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Как правильно реализавоть регистацию Shell Extension?


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
wild-ru
Новичок




Зарегистрирован: 16.02.2009
Сообщения: 1

СообщениеПн, 16-Фев-2009 18:46    Заголовок сообщения: Как правильно реализавоть регистацию Shell Extension?
Цитата

Подскажите, ко может...

Как правильно реализавоть регистацию класса расширения оболочки для виртуального файла (полученого через IEnumIDList). Например расширение IExtractIcon.

Может через интерфейс IQueryAssociation...?

Я делаю так:

- Зарегистрировал класс реализаии интерфейса IShellFolder TShellFolder для файла с нужным расширением по категории CATID_BrowsableShellExt.
- В функции CreateViewObject для IShellView создаю стандартный ShellView через SHCreateShellFolderView
- В функции EnumObjects возвращаю IEnumIDList
- В функции BindToObject для элемента из IEnumIDList возвращаю IShellFolder выполняемый тем же классом TShellFolder
- В функции GetUIObjectOf возвращаю IExtractIcon

Результат не радует: При реализации интерфейса IExtractIcon для расширения простанства имен конкретного фала , не отображаются иконки для виртуальных элементов список которых составляю через IEnumIDList. В дереве проводника иконки показываются правильно, а в самом списке справа показывается иконка непонятно какая, толи иконка основного класса , толи первая попавшаяся.

Один из вариантов реализация IExtractIcon:
delphi:
  1.  
  2. function TExtractIcon.GetIconLocation(uFlags: UINT; szIconFile: PWideChar; cchMax: UINT; out piIndex: Integer; out pwFlags: UINT): HResult;
  3. Begin
  4. StringToWideChar(GetModuleName(hInstance),szIconFi le,cchMax);
  5. piIndex := 0;
  6. pwFlags := GIL_DONTCACHE or GIL_PERINSTANCE;
  7. Result := S_OK;
  8. End;
  9.  
  10. function TExtractIcon.Extract(pszFile: PWideChar; nIconIndex: UINT;out phiconLarge, phiconSmall: HICON; nIconSize: UINT): HResult;
  11. Var Index:Integer;
  12. Begin
  13. if fpidl = nil Then Begin
  14. phiconLarge := HICON(LoadImage ( hInstance, PAnsiChar('ICON0'), IMAGE_ICON, LoWord(nIconSize), LoWord(nIconSize), LR_DEFAULTCOLOR ));
  15. phiconSmall := HICON(LoadImage ( hInstance, PAnsiChar('ICON0'), IMAGE_ICON, HiWord(nIconSize), HiWord(nIconSize), LR_DEFAULTCOLOR ));
  16. End Else Begin
  17. Index := PMainItem(RelativeFromAbsolute(fpidl)).data.piInde x;
  18. phiconLarge := HICON(LoadImage ( hInstance, PAnsiChar('ICON'+IntToStr(Index)), IMAGE_ICON, LoWord(nIconSize), LoWord(nIconSize), LR_DEFAULTCOLOR ));
  19. phiconSmall := HICON(LoadImage ( hInstance, PAnsiChar('ICON'+IntToStr(Index)), IMAGE_ICON, HiWord(nIconSize), HiWord(nIconSize), LR_DEFAULTCOLOR ));
  20. End;
  21. Result := S_OK;
  22. End;
  23.  


Может проблема заключатся в том, что в методе интерфейса IEnumIDList функция Next в параметре rgelt должна возвращать PItemIDList , который содержит полный путь начиная с DesctopFolder ? ( Т.е. этот параметр используется виндовым шелом как полный путь, а не как описание одного элемента ItemID). В общем перепробовал многое , ничего не помогает.
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100