1) Существует множество расширений оболочки, которые могут запрашивать содержимое ваших файлов. Например, обработчик значков .ico-файлов. Также пользователь может установить, например, расширение информационной подсказки, которое показывает тег ID3 из mp3-файла, а также запрашивает содержимое файла. Пользователь может настроить дополнительные столбцы в подробном представлении, и некоторые из них запрашивают содержимое файла. Таким образом, вы должны контролировать множество деталей в расширении пространства имен вашей оболочки.
2) Чтобы создать реализацию по умолчанию, просто вызовите CoCreateInstance(CLSID_ShellFileSystemFolder, nil, CLSCTX_INPROC_SERVER, IID_IShellFolder, ShellFolder).
3) Есть проблема. Например:
- Shell запрашивает неизвестный IShellFolder3 из NSE.
- Ваш NSE не реализует IShellFolder3, и NSE запрашивает IShellFolder3 из реализации по умолчанию и возвращает результат.
- Вызов оболочки IShellFolder3.GetUIObject с IID_IExtractImage и IShellFolder3 по умолчанию вернет установленный обработчик миниатюр.
Также такие методы могут привести к АВ внутри Проводника (из моей практики).
Поэтому я считаю, что ваша NSE должна реализовать все известные интерфейсы, реализованные по умолчанию. Если вы не хотите менять поведение метода, просто передайте параметры реализации по умолчанию. Known (by me) interfaces: IBrowserFrameOptions, IOleCommandTarget, IPersist, IPersistIDList, IPersistFolder, IPersistFolder2, IPersistFolder3, IParentAndItem, IShellFolder, IShellFolder2, IObjectWithFolderEnumMode, IShellDetails, IShellFolderViewCB, IFolderFilter, INameSpaceTreeControlFolderCapabilities, IShellIcon, IShellIconOverlay, IFolderType, IFolderViewSettings, IExplorerPaneVisibility, IPropertyStoreFactory, IPropertyStore , IItemNameLimits, IThumbnailFactory.
4) Насколько я понимаю, вы должны контролировать запросы следующих интерфейсов: IDataObject, IDropTarget, IExtractIconA(W), IExtractImage, IPropertyStore, IPropertyStoreFactory, IShellFolder(2), IQueryInfo.
5) IShellIcon.GetIconOf должен возвращать значок расширения по умолчанию.
6) Также, если ваша папка содержит подпапки, не забудьте вернуть вашу реализацию, когда оболочка запрашивает IShellFolder(2) подпапки.
person
Denis Anisimov
schedule
03.12.2014
IShellFolder
по умолчанию для моей папки. По-видимому, соответствующим классом является папка файловой системы оболочки (CLSID{F3364BA0-65B9-11CE-A9BA-00AA004AE837}
). - person Thomas Levesque   schedule 03.12.2014SHGetDesktopFolder
илиSHGetFolderLocation
. - person Roman R.   schedule 03.12.2014BindObject
на рабочем столеIShellFolder
- person Thomas Levesque   schedule 03.12.2014