您的位置:首页 > 其它

OverlayIcon 制作流程及注意项

2015-03-13 01:24 141 查看
为了制作类似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,不然效果也有可能无法出现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: