Зарегистрируйте обработчик миниатюр для папки, а не для определенного типа файлов


Мне нужно написать обработчик миниатюр для всех файлов в данной папке. Эта папка является точкой монтирования для виртуальной файловой системы (используя файловую систему обратного вызова ), и файлы фактически физически не присутствуют на локальной машине (они хранятся в облаке), поэтому, если я позволю обработчику миниатюр по умолчанию выполнять свою работу, он попытается загрузить все файлы с сервера... а это явно не то, чего я хочу.

Но теперь я просто понял, что обработчик миниатюр должен быть зарегистрирован для каждого типа файла:

Регистрация обработчика миниатюр основана на стандартных ассоциациях файлов.

(из документации )

Я не хочу регистрировать его для каждого типа файлов, потому что я не хочу изменять поведение для файлов, которые не находятся в моей виртуальной папке. Есть ли способ, чтобы мой обработчик вызывался для всех файлов в моей виртуальной папке и только для них?

1 2

1 ответ:

Я вижу для тебя два пути.

Простой способ: зарегистрируйте свой собственный обработчик миниатюр и позвольте ему работать со всеми файлами. Если вы не поддерживаете IInitializeWithStream, а только IInitializeWithItem или IInitializeWithFile, Вы можете проверить, находится ли элемент/файл в вашей виртуальной файловой системе. Если это так, вы можете вернуть миниатюру и в противном случае вернуть ошибку.

Проблема этого подхода заключается в том, что на каждый тип файла может быть зарегистрирован только один поставщик миниатюр.

Трудный путь: вы можете написать расширение пространства имен оболочки. Эти может использоваться для отображения виртуальных папок, которые могут быть настроены различными способами. Это еще один способ сделать то, что вы уже сделали с помощью cbfs, но он ограничен только проводником. Это добавило бы еще один способ отображения виртуальных папок.

Расширение пространства имен оболочки будет работать только для своей собственной виртуальной папки. Если вы сопоставили виртуальные папки с буквой диска и пользователь открывает этот диск в Проводнике (а не виртуальную папку расширения пространства имен оболочки), пользователь увидит обычный вид проводника файлов, а не расширение пространства имен оболочки.

Также: документация для расширений пространства имен shell-это боль, там не так много доступно. Я написал свое собственное расширение пространства имен оболочки, и каждый раз, когда мои объекты запрашивали IID, я отслеживал это и узнавал немного больше. Я видел, что мое расширение запрашивается для IID_IThumbnailHandlerFactory, я также видел IIDs, такие как IID_IExtractIconA или IID_IContextMenu, но я не видел IID_IThumbnailProvider, и я не видел IID_IExtractImage. Это предполагает, что вы не можете иметь свой собственный IThumbnailProvider непосредственно прикрепленный к объектам, которые вы создаете для виртуальной папки, но это также может быть, что я просто пропустил, чтобы установить какой-то флаг где-то еще, так что Explorer даже не пытается запросить меня.