OverlayIcon 制作流程及注意项

来源:互联网 发布:阿里云搭建vpn云免 编辑:程序博客网 时间:2024/06/05 17:43

 为了制作类似SVN的图标覆盖特效,我确实花了一些时间。目前做到的程度是开发的DLL其Release版本可以在XP、Win7上使用。

第一步:

    参考How to 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,不然效果也有可能无法出现。