windows - namespace 扩展的图标覆盖处理程序

标签 windows com atl windows-shell shell-extensions

我正在开发命名空间扩展,它提供服务器上文件的虚拟 View 。在此 View 中,我需要使用叠加图标提供文件的不同状态(使用中、离线、不同步等)。

我阅读了实现覆盖处理程序的文章,并认为我会尝试在我们的一个覆盖处理程序中处理这个问题,它实现了 IShellIconOverlayIdentifier 接口(interface)。

我看到 IShellIconOverlayIdentifier::IsMemberOf() 和其他函数仅在我访问普通文件系统上的文件时被调用,即 c:\、d:\等。当我浏览命名空间扩展时,这些调用不会被调用根本。这是为什么?如何为命名空间扩展中的对象实现覆盖?

问候, 马杜

最佳答案

添加覆盖图标的唯一方法是实现 IShellIconOverlay在你的 NSE 中。但问题是 IShellIconOverlay.GetOverlayIndex 和 IShellIconOverlay.GetOverlayIconIndex 必须返回从 SHELL 图像列表收到的图标。可以使用 SHGetIconOverlayIndex 函数接收来自外壳图像列表的叠加图标。并且没有方法可以将额外的覆盖图标添加到 shell 图像列表中。

如果您想使用标准的覆盖图标,如链接或共享图标,只需使用 SHGetIconOverlayIndex。但是如果你想使用自定义图标,你必须使用“hack”。 Hack 是简单的附加覆盖外壳扩展。只有覆盖外壳扩展可以将额外的覆盖图标添加到外壳图像列表中。在 IShellIconOverlayIdentifier.GetOverlayInfo 中,您将返回您的图标和索引,IShellIconOverlayIdentifier.IsMemberOf 将始终返回 S_FALSE。在 IShellIconOverlay_GetOverlayIndex 的 NSE 内部,您将使用您的图标和索引调用 SHGetIconOverlayIndex。

NSE overlay icon

您必须为每个图标使用单独的覆盖外壳扩展。但不要忘记 Windows 对系统中注册的覆盖外壳扩展的最大数量有限制。我不记得确切的数字,但大约是 15。

关于windows - namespace 扩展的图标覆盖处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20975679/

相关文章:

python - Standard Streams 文件是否存储在磁盘中?

windows - Windows 上的 Scala 服务

c++ - 从C++程序调用git clone

c++ - 从 Byte 数组创建 CImage

python - 如何获取执行卡住脚本的路径

com - 进程外 COM 服务器的注册表项

c - 纯 C 中的 Win32 COM 编程

.net - COM 互操作 (CCW) 中的重载 - IDispatch 名称包含后缀(_2、_3 等)

c++ - 使用 COM 进行异常安全的内存处理

c++ - 如何在基于 ATL 的服务器中正确转换和使用 native COM 类型?