请问怎么用VC++得到本机上的所有文件类型? 看一下,hkey_class_root\下全是文件类型. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 贴一篇吧: 文件类型探测程序 文/赵湘宁 本文例子程序 记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标? 这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如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函数获得图标,接着将图标显示在一个静态图标控制上,详细的实现细节请参考本文附带的程序 问一个MFC操作文件的问题 升双星庆祝,送300分,沙发保证100分,倒序沙发也保证100分。 VC2005中如何清除编辑对话框时自己添加的某条参考线? 前两天看到一个帖子,就是问:在一个类A中是否可以 A a; / A& a;/ A* a 之类的,求那个帖子URL 在线求助!! 讨论:在MFC框架下,如何提高CWnd::OnPaint的窗口重画效率? 求助关于动态创建表 请教MFC CAsyncSocket类用法 我在程序中动态创建了一个CListCtrl: 如何学习网络编程? 如何得到网卡的序列号 EDIT控件问题?
文件类型探测程序
文/赵湘宁
本文例子程序
记得我以前写过一篇文章是关于如何从一个可执行程序中吸取图标。本文将讨论如何得到与特定的文件类型关联的文件图标?
这个问题依赖于你是想要得到一个指定文件的图标还是只想得到普通文件的图标。如果你有一个特定的文件,如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函数获得图标,接着将图标显示在一个静态图标控制上,详细的实现细节请参考本文附带的程序