c++ - 是否可以继承默认的 IShellFolder 实现?

标签 c++ windows shell winapi shell-extensions

我正在尝试实现一个 shell 命名空间扩展,其唯一目的是覆盖特定文件夹中的缩略图处理程序 (IExtractImage)。 我希望其他一切都与普通文件夹中的一样,我宁愿不必重新实现在 IShellFolder 的默认实现中所做的一切...

那么,是否可以继承这个默认实现呢?如果是,怎么办?

使用组合也是一个可接受的解决方案,但我如何才能为给定文件夹获取类的实例?

最佳答案

1) 有许多 shell 扩展可以请求您的文件内容。例如 .ico 文件图标处理程序。用户还可以安装例如信息提示扩展,它显示来自 mp3 文件的 ID3 标签,它也请求文件内容。用户可以在详细 View 中设置其他列,其中一些请求文件内容。因此,您必须控制 shell namespace 扩展中的许多细节。

2) 要创建默认实现,只需调用 CoCreateInstance(CLSID_ShellFileSystemFolder, nil, CLSCTX_INPROC_SERVER, IID_IShellFolder, ShellFolder)。

3) 有问题。例如:

  1. Shell 从您的 NSE 查询未知的 IShellFolder3。
  2. 您的 NSE 未实现 IShellFolder3,NSE 从默认实现中查询 IShellFolder3 并返回结果。
  3. 使用 IID_IExtractImage 和默认 IShellFolder3 的 Shell 调用 IShellFolder3.GetUIObject 将返回已安装的缩略图处理程序。

这些方法也可能导致 Explorer 中的 AV(根据我的实践)。

所以我相信你的NSE必须实现默认实现的所有已知接口(interface)。如果您不想更改方法的行为,只需将参数传递给默认实现即可。已知(我)接口(interface):IBrowserFrameOptions、IOleCommandTarget、IPersist、IPersistIDList、IPersistFolder、IPersistFolder2、IPersistFolder3、IParentAndItem、IShellFolder、IShellFolder2、IObjectWithFolderEnumMode、IShellDetails、IShellFolderViewCB、IFolderFilter、INameSpace TreeControlFolderCapabilities、IShellIcon、IShellIconOverlay、IFolderType、IFolderViewSettings、IExplorerPaneVisibility、IPropertyStoreFactory、IPropertyStore , IItemNameLimits, IThumbnailFactory.

4) 据我了解,您必须控制以下接口(interface)的请求:IDataObject、IDropTarget、IExtractIconA(W)、IExtractImage、IPropertyStore、IPropertyStoreFactory、IShellFolder(2)、IQueryInfo。

5) IShellIcon.GetIconOf 必须返回扩展的默认图标。

6) 此外,如果您的文件夹包含子文件夹,请不要忘记在 shell 请求子文件夹的 IShellFolder(2) 时返回您的实现。

关于c++ - 是否可以继承默认的 IShellFolder 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27269757/

相关文章:

c++ - 如何在C++中将二进制文件转换为WAV文件

linux 服务器上的 c++ cgi

node.js - npm 链接导致 javascript 语法错误

BASH 通配符 : Select all variables (not the content)

C++20 std::ranges:范围适配器跳过每个第 n 个元素

c++ - 如何从另一张 map 构建一张 map ?

c# - 面试题

python - 在 Python 中使用 DPAPI?

windows - 使用托管 Web 核心在 Windows Azure Web 角色中提供 .ogg

Linux 命令 : Why does the redirection operator - | i. e。管道在这里失败?