【发布时间】:2015-10-31 06:39:07
【问题描述】:
我正在实现代表服务器上远程文件系统的命名空间扩展,我希望图标覆盖以显示文件状态(锁定),就像这里的另一个问题一样:icon overlay handlers for namespace extension
那个问题已经回答了,我已经按照建议做了所有事情:
创建了附加的外壳扩展,并实现了 IShellIconOverlayIdentifier 接口: 在 IShellIconOverlayIdentifier.GetOverlayInfo 我返回图标文件和图标索引。 在 IShellIconOverlayIdentifier.IsMemberOf 中,我返回 S_FALSE 以不显示系统中任何其他文件的覆盖。
在主 NSE 中,我实现了 IShellIconOverlay 接口,并使用 SHGetIconOverlayIndex 函数从系统图像列表中检索我的图标覆盖。
问题是:SHGetIconOverlayIndex 总是返回-1。
但是!如果我返回 S_OK 作为 IShellIconOverlayIdentifier.IsMemberOf 的结果 - SHGetIconOverlayIndex 立即开始提供正确的覆盖索引!但当然,在这种情况下,我的叠加层会添加到系统中的所有文件中,包括我的 NSE。
有趣的是,如果我在 IShellIconOverlayIdentifier.IsMemberOf 的后续调用中返回 S_FALSE - SHGetIconOverlayIndex 仍然给出正确的覆盖索引,一切都变得很好:我只有 NSE 中有覆盖......
我做错了什么以及如何从一开始就得到这个结果?可能是缓存问题?..
(抱歉,我无法将其写为对所提及问题的评论,因为我没有足够的声誉......)
【问题讨论】:
-
您的系统中注册了多少个图标处理程序?
-
我的意思是覆盖图标处理程序。
-
@Denis,你是天才!是的,我的开发系统中有超过 15 个,所以我将“000”字符放在注册表中名称的开头以将其放置在更高的位置。刚刚在另一个系统上尝试了它,只注册了 4 个非系统覆盖处理程序 - 它从一开始就加载了我的图标!我怎样才能在第一个系统上得到这个结果?重置一些外壳图标缓存?..
-
试图在 NSE dll 附加上调用 FileIconInit(TRUE) - 没有帮助。
标签: windows com atl windows-shell shell-extensions