Я пытаюсь реализовать расширение пространства имен оболочки, с единственной целью переопределить обработчик миниатюр (IExtractImage
) в определенной папке. Я хочу, чтобы все остальное было таким же, как в обычной папке, и я бы предпочел не переопределять все, что делается в реализации по умолчанию IShellFolder
…
Итак, возможно ли наследовать от этой реализации по умолчанию? Если так, то как?
Использование композиции также будет приемлемым решением, но как я могу получить экземпляр класса для данной папки?
1) Существует множество расширений оболочки, которые могут запрашивать содержимое ваших файлов. Например, обработчик значка .ico-файла. Также пользователь может установить, например, расширение подсказки, которое показывает тэг ID3 из mp3-файла и также запрашивает содержимое файла. Пользователь может настроить дополнительные столбцы в подробном представлении, и некоторые из них запрашивают содержимое файла. Таким образом, вы должны контролировать много деталей в вашем расширении пространства имен оболочки.
2) Чтобы создать реализацию по умолчанию, просто вызовите CoCreateInstance (CLSID_ShellFileSystemFolder, nil, CLSCTX_INPROC_SERVER, IID_IShellFolder, ShellFolder).
3) Есть проблема. Например:
Также такие методы могут привести к AV внутри Explorer (из моей практики).
Поэтому я считаю, что ваша NSE должна реализовывать все известные интерфейсы, реализованные по умолчанию. Если вы не хотите изменять поведение метода, просто передайте параметры в реализацию по умолчанию. Известные (мной) интерфейсы: 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) из подпапки.