文件类型探测程序
来源:互联网 发布:淘宝手机助手登陆不了 编辑:程序博客网 时间:2024/05/01 19:42
文件类型探测程序本文例子程序 记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标?
这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如C:/MyFile/SomeFile.zzp。那你可以调用ExtractAssociatedIcon函数获得于特定文件关联的图标。但这个函数只适用于磁盘上存在实际的文件(或某处可存取)。
如果你想查找与一般文件类型关联的图标,那你就必须读注册表。例如,为了查找出.cpp文件使用的图标,你就要察看注册表的HKEY_CLASSES_ROOT/.cpp入口,在我的机器上,其第一行的值是“cppfile”,然后继续察看HKEY_CLASSES_ROOT/cppfile的DefaultIcon键值,在我的机器上是:
HKEY_CLASSES_ROOT/cppfile/DefaultIcon =
"C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe,-20209"
所以.cpp文件的图标在C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe文件中的图标资源ID号为20209。一般情况下,HKCR/.foo有一个类似foofile的入口值,并在HKCR /foofile/DefaultIcon中指定了cpp文件的图标。
但是,有的时候.foo的入口值不是foofile,而是象“SuperApp.Document.5”,它的意思是SuperApp文档的第五个版本,在HKEY_CLASSES_ROOT/ SuperApp.Document.5中没有DefaultIcon键值,但有键值CLSID={又长又丑的十六进制GUID},这就告诉你.foo是COM对象,其类的ID值就是那又长又丑的十六进制GUID。要得到关联的图标,必须到/CLSID/{又长又丑的十六进制GUID}/ DefaultIcon查找。哭吧!太痛苦了。但是还没完呢!因为foofile还可能有一个定制的以外壳扩展形式实现的图标处理器。为此你还要检查一下,加载这个图标处理器,调用IShellIcon或者IExtractIcon 并且继续哭吧,这真是太荒唐啦!
所幸的是,有一个更好的方法来避开令人厌恶的注册表,那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.txt。即便文件不存在,SHGetFileInfo也能获得你要的信息。
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo("foo.bmp",
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
为了展示它的使用方法,我写了一个小应用程序,FileType(参见图一),图一 对话框中有一个编辑框,在这个编辑框中可以输入任何文件的扩展名如txt、jpg、bmp等来察看与相应文件关联的图标。实现方法很直接:当用户敲入新的扩展名,Windows发送一个EN_UPDATE通知消息;然后对话框调用SHGetFileInfo函数获得图标,接着将图标显示在一个静态图标控制上,详细的实现细节请参考本文附带的程序。
这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如C:/MyFile/SomeFile.zzp。那你可以调用ExtractAssociatedIcon函数获得于特定文件关联的图标。但这个函数只适用于磁盘上存在实际的文件(或某处可存取)。
如果你想查找与一般文件类型关联的图标,那你就必须读注册表。例如,为了查找出.cpp文件使用的图标,你就要察看注册表的HKEY_CLASSES_ROOT/.cpp入口,在我的机器上,其第一行的值是“cppfile”,然后继续察看HKEY_CLASSES_ROOT/cppfile的DefaultIcon键值,在我的机器上是:
HKEY_CLASSES_ROOT/cppfile/DefaultIcon =
"C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe,-20209"
所以.cpp文件的图标在C:/PROGRA~1/MICROS~4/Common/MSDev98/Bin/msdev.exe文件中的图标资源ID号为20209。一般情况下,HKCR/.foo有一个类似foofile的入口值,并在HKCR /foofile/DefaultIcon中指定了cpp文件的图标。
但是,有的时候.foo的入口值不是foofile,而是象“SuperApp.Document.5”,它的意思是SuperApp文档的第五个版本,在HKEY_CLASSES_ROOT/ SuperApp.Document.5中没有DefaultIcon键值,但有键值CLSID={又长又丑的十六进制GUID},这就告诉你.foo是COM对象,其类的ID值就是那又长又丑的十六进制GUID。要得到关联的图标,必须到/CLSID/{又长又丑的十六进制GUID}/ DefaultIcon查找。哭吧!太痛苦了。但是还没完呢!因为foofile还可能有一个定制的以外壳扩展形式实现的图标处理器。为此你还要检查一下,加载这个图标处理器,调用IShellIcon或者IExtractIcon 并且继续哭吧,这真是太荒唐啦!
所幸的是,有一个更好的方法来避开令人厌恶的注册表,那就是使用SHGetFileInfo函数,调用这个函数可以获得所有关于文件的信息。它有一个聪明的选项,SHGFI_USEFILEATTRIBUTES,这个选项允许你传递一个假文件名,如mumble.txt。即便文件不存在,SHGetFileInfo也能获得你要的信息。
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo("foo.bmp",
FILE_ATTRIBUTE_NORMAL,
&shfi, sizeof(shfi),
SHGFI_ICON|SHGFI_USEFILEATTRIBUTES);
为了展示它的使用方法,我写了一个小应用程序,FileType(参见图一),图一 对话框中有一个编辑框,在这个编辑框中可以输入任何文件的扩展名如txt、jpg、bmp等来察看与相应文件关联的图标。实现方法很直接:当用户敲入新的扩展名,Windows发送一个EN_UPDATE通知消息;然后对话框调用SHGetFileInfo函数获得图标,接着将图标显示在一个静态图标控制上,详细的实现细节请参考本文附带的程序。
- 文件类型探测程序
- 文件类型图标探测程序
- 文件类型探测程序
- 文件类型探测程序
- 绕开注册表探测文件类型
- Python 探测图片文件类型
- shell的逻辑运算符 探测文件类型 比较数值、字符串等
- autoconf通用程序探测宏
- autoconf通用程序探测宏
- 探测FTP密码的程序源码!!!
- 安卓程序UI探测工具
- autoconf 个别特殊程序的探测
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- 文件类型
- VC++的链接错误LNK2001
- VC_ODBC总结
- 战争又起
- 未来微软桌面软件将与SAP商务软件实现互通
- Visual C 串口操作
- 文件类型探测程序
- COM - 给 C++ 程序员的 COM 入门指南
- java处理图片
- 分享:用PreRender解决DataGrid分页最后一页行数不满的排版问题
- VC++6.0下 开发MFC OLE DB用户程序
- 开始使用Blog
- 数据结构(五)
- 睡眠
- 给年轻工程师的十大忠告(转)