Windows CE如何根据文件名获取其对应文件图标icon
1、背景介绍
如果把一文件copy到Windows CE5.0系统的U盘(或者桌面等目录)中,那么这个文件就会有其对应的图标显示,如下图。那么Windows CE5.0文件系统是如何管理文件和其对应图标的呢?
2、文件图标简介
在WCE5.0系统中,你能看到的图标都有其对应的图标资源,问题就在于这些图标在哪里,而WCE系统又是如何管理的呢?说到底,文件图标资源存在于两种形式——exe文件和dll文件中。
◆EXE文件图标
每个exe文件都有其对应的文件图标,可以通过函数ExtractIconEx来获取exe文件中图标。
◆dll文件中的图标
许多dll中都包含有图标资源,可以通过ExtractIconEx和LoadImage来获取dll中的图标(要知道图标ID)。
3、Windows CE源码分析
有关这部分源码在:$:/WINCE500/PUBLIC/SHELL/OAK/HPC/CESHELL/API/iconcache.cpp文件中,其实就涉及到一个函数:
CIconCache::CacheInfo * CIconCache::CacheItem(LPCWSTR pszFilePath)
理解了这个函数,也就理解了本课题。首先输入参数仅仅是一个文件的完整路径,也就是说WCE只要根据一文件名就可以得到其对应文件类型图标。如图3-1紧接着ASSERT(!PathIsDirectory(pszFilePath))确保输入参数不是路径。PathIsGUID判断文件名是不是GUID,不是GUID就是系统文件了(// It's a file system file)。
图3-1 CacheItem函数
PathIsExe函数判断文件是否为exe文件,是就用ExtractIconEx获取其图标。不是exe文件继续往下走,用PathFindExtension获取文件后缀名。根据后缀名到注册表去查找文件类型——// TYPE: Figure out the type information,再根据后缀去查找图标——// ICON: Get the requested icons。
这里注册表会包含后缀名的一些信息。举个例子,比如*.bmp文件,先查找注册表[HKEY_CLASSES_ROOT/.bmp],于是你可以看到如图3-2所示的画面,其中Default项的值为bmpimage,那么在注册表[HKEY_CLASSES_ROOT/bmpimage/DefaultIcon]会看到如下信息,说明bmp文件图标就是imageviewer.exe的图标。再看看dll文件的信息[HKEY_CLASSES_ROOT/dllfile/DefaultIcon],如图3-4,说明*.dll文件的图标是ceshell.dll中ID为4608的图标。
图3-2
图3-3
图3-4
4、总结
WCE文件系统根据文件名,通过注册表管理其对应的文件图标。总结有三种情况:
◆*.exe文件
Exe文件最简单,直接通过ExtractIconEx获取文件图标。
◆简介exe文件,如*.bmp等
如*.bmp文件虽然不是exe文件,但在注册表中会将*.bmp文件关联到imageviewer.exe,再通过ExtractIconEx获取imageviewer.exe图标作为*.bmp文件图标。
◆WCE系统SHELL中的图标
如*.dll文件,在注册表中关联的并不是exe文件,那么这样情况,是由ceshell.dll中的图标来作为*.dll的文件图标。