2017-01-28 12 views
1

Я создал виртуальную файловую систему (а не расширение пространства имен) для Windows, которая выступает в качестве интерфейса нашего сервера управления документами, состоящего из файлов и папок. Чтобы иметь возможность отображать некоторые метаданные объектов DMS в проводнике Windows в качестве дополнительных выбираемых столбцов, я успешно предоставил свойства в Систему свойств Windows, реализовав обработчик свойств COM. Если обычные обработчики свойств фокусируются на определенных типах файлов, за которые они чувствуют ответственность, мой обработчик свойств добавляет свойства ко всем файлам независимо от их типа. Поскольку недвижимость Обработчики могут быть зарегистрированы только на уровне типа файла, я зарегистрировал свой обработчик около 30 типов подКак зарегистрировать обработчик свойств в папках?

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\<.Extension>

Однако мне не удалось зарегистрировать обработчик свойств для объектов папки. Поскольку все объекты в нашей файловой системе являются виртуальными, я создаю хранилище свойств (IPropertyStore) путем реализации IInitializeWithFile вместо IInitializeWithStream. Свойства запрашиваются у нашей DMS по пути IInitializeWithFile, действующего в качестве ключа, и не были прочитаны из содержимого объектов. Эта концепция будет работать и для папок.

Для вызывался по папкам Я пытался связать обработчик, зарегистрировав в различных хорошо известных идентификаторов как Folder, Directory, AllFileSystemObjects и * вместо расширения файла без успеха. Я также ничего не нашел в документации MSDN в отношении этого аспекта.

Есть ли способ зарегистрировать обработчик свойств Windows в папках? Или есть другой способ добавить пользовательские столбцы в папки в проводнике Windows?

+0

Если это не NSE, как вы реализуете эту виртуальную файловую систему? Пользовательский драйвер ядра и установка его в качестве буквы диска? – Anders

+0

@ Anders: Да, я использую драйвер стороннего ядра, который позволяет реализовать файловую систему в пространстве пользователя в .NET и монтировать ее как букву диска. Обработчик свойств COM реализован на C++. –

+0

Не настоящее решение, но более старые интерфейсы расширений оболочки обработчика столбцов с 2000/XP по-прежнему работают в некоторых сторонних версиях Explorer. – Anders

ответ

1

Я не уверен, что это возможно.

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

Старые обработчики столбцов были бы вашим лучшим выбором (ИМХО), но они официально мертвы, и вы уже сказали, что не можете их использовать.

Вы считали создание расширения пространства имен? Либо в качестве корневого элемента где-нибудь (Рабочий стол или Мой компьютер), как мои документы использовались для работы в 2000/XP или, возможно, что-то большее в соответствии с тем, как работает OneDrive?

Я не уверен, что файлы desktop.ini работают in the root of a drive, но, возможно, стоит посмотреть. Затем вы окажетесь на земле poorly documented[.ShellClassInfo] и ее CLSID, CLSID2 и UICLSID. Общая идея заключалась бы в том, чтобы выступать в качестве прокси-сервера IShellFolder поверх «реального» IShellFolder, чтобы вы могли создать multiplex property store. Я думаю, что есть некоторые (недокументированные?) Ключи свойств, которые вы можете переопределить для изменения столбцов по умолчанию и всплывающих подсказок.

Существует также что-то, что называется delegated folder, что позволяет играть с вложенными PIDL, но документация снова бесполезна, поэтому я не уверен, что это то, что стоит посмотреть.

Третий вариант заключается в том, чтобы притворяться cloud storage provider. Я не знаю, приблизит ли это вас к вашей цели, и вам все равно придется реализовать некоторые бит NSE, чтобы добраться до точки, где вы можете сложить себя поверх основного IShellFolder.Эта функция довольно новая и только документирована для работы в Windows 10.

Внутренняя работа, с которой Explorer/IShellBrowser подключена к IShellFolder/IShellView, является одной из наименее задокументированных частей Windows. Существуют сотни недокументированных интерфейсов. Explorer gives DefView special treatment, оставляя другие сторонние реализации на холоде.

У меня такое ощущения, что нет чистого решения осуществить это в верхней части буквы диска, но вы можете получить повезли, если Raymond Chen падает он, возможно, есть несколько советов для вас ...

+0

Очень интересно, я углубится в интеграцию поставщика облачных хранилищ. Тем не менее, я попытаюсь дать некоторый фон нашего подхода, в котором мы привязаны к реальной (виртуальной) файловой системе из-за ее прозрачности. Он обеспечивает прозрачный доступ к файлам и каталогам для всех приложений и инструментов, которые могут работать с обычными API-интерфейсами файловой системы по пути, который важен для некоторых задач автоматизации или при работе с файловой системой из командной строки. С другой стороны, NSE предоставляет свои объекты только через оболочку для процессов, связанных с оболочкой, таких как Проводник Windows. –

+0

Итак, да, нам нужно просмотреть файловую систему в Проводнике Windows, но не только там. Кроме того, многие логики будут распространяться по многим процессам Windows Explorer, а не централизованно только в одной файловой системе. Теперь, после внедрения обработчиков для контекстных меню, наложения значков, предварительные просмотры и скобки копирования на основе нашего подхода к файловой системе, отсутствует только небольшой строительный блок, касающийся свойств в папках. Спасибо за подробный ответ. –

+1

Четвертое, что вы могли бы попробовать, это указать psvOuter при вызове SHCreateShellFolderView в NSE. Я никогда не пробовал это делать, но, возможно, это дает вам достаточно контроля, позволяя вам просто использовать собственный оболочку, предоставляемую IShellFolder, которая находится поверх вашей файловой системы. Или жестокий подход; зацепив родные элементы таблицы vhellFolders vtable. Конечно, цель состоит не в том, чтобы повторно реализовать все обработчики меню и значков. – Anders