问题的提出:为了取得URL快捷方式的图标。
如收藏夹中的CSDN.url,用记事本打开如下:
[InternetShortcut]
URL=http://community.csdn.net/
IDList=
IconFile=http://community.csdn.net/favicon.ico
IconIndex=1
一旦访问过这个网页,再回到收藏夹目录看这个URL文件,即可看到这个文件的图标已经变成CSDN的图标了。理论上来说,这个图标一定在硬盘的某个角落,否则是不会显示的。但从上述文件内容来看,http://community.csdn.net/favicon.ico这个ICO或对应的ICO保存在什么地方呢?我找了下临时文件夹,无果。于是只得寻求其他办法。
又想到既然是快捷方式,用IShellLink接口如何呢?用IShellLink的GetIconLocation是否可行呢?我没有验证,但这即使能成功,又涉及到SHELL扩展编程中的一些知识,比如获取PIDL等问题,代码略显繁琐。
最后想到用系统图标,即从系统图像列表中取得。
大致流程如下:
1、用SHGetFileInfo获得URL文件的SHFILEINFO结构,其中SHGetFileInfo的uFlags标志使用SHGFI_SYSICONINDEX;
2、SHGetFileInfo的返回值既是系统图形列表(imagelist)的句柄;
3、SHFILEINFO结构的iIcon即是图标在列表中的索引;
4、用ImageList_GetIcon即可列表中取得图标的句柄(至此基本大功告成了);
5、如果需要进一步获得直观的StdPicture对象,还需使用OleCreatePictureIndirect。
在此抛砖引玉,不知道大家是否有更好的办法?