OverlayIcon制作流程及注意项
为了制作类似SVN的图标覆盖特效,我确实花了一些时间。目前做到的程度是开发的DLL其Release版本可以在XP、Win7上使用。
第一步:
参考Howto overlay an icon over existing shell objects in 3 easy steps – CodeProject这篇文章,按步骤做。
这一步做完后,编译会出现:
error C2787: “IShellIconOverlayIdentifier”: 没有与该对象关联的 GUID
这样的错误
第二步:
在MyOverlayIcon.h文件添加
struct _declspec (uuid("987423F4-904A-4ACF-9803-EC28B51C1993"))IShellIconOverlayIdentifier;
//UUID替换为自己工程中的UUID
这样编辑将不会出现错误了。
第三步:
检查注册表
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\]下的项是否超过了15个
如果该键含有太多的SubKey那么也将不会显示,或者仅在资源管理器的左边的树形结构上进行显示。
第四步:
重启Explorer进程,然后右键“刷新”。
第五步:
检查工程的属性->配置属性->C/C++->预处理器->预处理器定义
里面的值要包含:_ATL_NO_UUIDOF(我不知道为什么,但是不写就真的不行)
IShellIconOverlayIdentifier说明三个函数说明:
Shell通过调用IShellIconOverlayIdentifier::GetOverlayInfo请求处理程序图标覆盖的位置。图标覆盖处理程序返回包含覆盖图标的文件的名称,以及他们在文件中的索引。然后,Shell添加这些图标覆盖到系统图像列表。
Shell通过调用IShellIconOverlayIdentifier::GetPriority来确定图标覆盖的优先级。优先级值是从0到100的数字,其中100表示最低优先级。如果有多个图标覆盖被特定文件请求,Shell使用这些值来帮助确定哪个图标覆盖将显示
在绘画一个对象图标之前,Shell传递对象名称到每个图标覆盖处理程序的IShellIconOverlayIdentifier::IsMemberOf方法。图标覆盖处理程序通常与特定文件分组相关。例如,图标覆盖处理程序可能请求一个文件类型的所有成员的一个覆盖,就像一个.myp文件名扩展的所有文件。如果处理程序想要他的图标覆盖被显示,它返回S_OK。然后Shell调用处理程序IShellIconOverlayIdentifier::GetOverlayInfo方法决定哪个图标将显示。
说明:
1. 目前不知道如何调试实现IShellIconOverlayIdentifier接口的DLL。在VS2005下选择Debug模式,启动调试我也输入了C:\windows\explorer.exe进程,但是提示“无法找到explorer.exe的调试信息”。故开发OverlayIcon特效时如何调试是个问题。
2. 为了能在XP上也运行,需要考虑在VS2005中,项目属性->配置属性->常规->ATL的使用选择“静态连接到ATL”。
3. 在Win7上开发时,可以考虑先关掉UAC,不然效果也有可能无法出现。