2010-10-03 44 views
2

我想向用户显示一个已知文件扩展名列表供他选择。我知道这些都是存储在注册表HKEY_CLASSES_ROOT下通常是这样的:从注册表中读取已知的文件扩展名/类型

.TXT - >(默认值)=“txtfile”

其中txtfile然后包含相关程序等

不幸的是,信息在注册表中的那个地方还存储大量的其他按键,如文件类型(例如txtfile)和条目类似

CAPICOM.Certificates(无论是)

如何确定的EN尝试是文件扩展名?还是有不同的方式来获得像API函数这些扩展?

(我不认为它很重要,但我使用德尔福的计划。)

+0

万一有人有兴趣,这是我最后写道:http://sourceforge.net /p/dzlib/code/125/tree/dzlib/trunk/src/u_dzFileTypes.pas请注意,目前它大多未经测试。 – dummzeuch 2012-05-01 17:08:13

回答

3

不能保证HKEY_CLASSES_ROOT中每个以点为前缀的键都用于文件关联,但每个文件关联都需要创建一个以点为单位的键。有关File Types主题,请参阅MSDN。我们在这里描述的方法符合Windows 设置文件关联功能如何工作以获得所有已知文件类型的列表。这是基于我以前的观察,当我研究这个问题。

为了实现这个目标,你需要做复杂的步骤如下:

  1. 枚举一个点.之前每次按键,你可以使用RegQueryInfoKey()和RegEnumKeyEx()用于此目的。

  2. 在一个点之前的每个键,看看默认值数据:

    一个。如果默认值是非空,这足以说明“前点密钥”用于所有Windows NT版本中的文件关联,然后尝试按值数据所述打开密钥名称,只需说TheKeyNameMentioned

    A1)如果子项shell\open\command下TheKeyNameMentioned,然后测试由该键的缺省值指向的路径的存在;如果路径存在,则存在与该扩展关联的默认应用程序;如果路径不存在,则默认应用程序是未知的。要获取文件扩展名说明,请查看默认值TheKeyNameMentioned。要获得程序说明,​​首先测试以下键是否包含等于EXE文件路径的值名称,即HKCR\Local Settings\Software\Microsoft\Windows\Shell\MuiCache。如果它存在,然后查看数值数据以获取文件描述;如果不存在,请直接使用GetFileVersionInfo()获取文件描述。

    A2)如果没有子项shell\open\command下TheKeyNameMentioned,那么默认的应用程序是未知的。要获取文件扩展名说明,请查看默认值TheKeyNameMentioned

    b。在Windows Vista和更高版本上,当点[a]失败时,您需要额外检查。如果默认值为为空,请测试该密钥是否有名为OpenWithProgIDs的子项。

    • 如果OpenWithProgIDs子项存在,使用RegEnumValue()来查找符合条件的第一个遇到的值的名称,也就是值名称必须指向现有的密钥(只是说: TheKeyNameMentioned。)与名称的名称相同。如果TheKeyNameMentioned存在,则这足以表示“前点密钥”用于文件关联。读取点a1a2为下一个步骤。

    • 如果OpenWithProgIDs子项不存在,则默认应用程序是未知的。要获取文件扩展名说明,请查看默认值TheKeyNameMentioned

希望有所帮助。 :-)

+0

我已经提供了一些额外的信息给我的答案。 – Vantomex 2010-10-04 10:44:18

+1

不要只看'shell \ open \ command'子项。任何自定义动词名称都可以在'shell'键下注册,而不仅仅是'open',并且并非所有动词都使用'command'子键,有些使用'ddeexec'或'DropTarget'子键。 – 2010-10-04 23:41:28

+0

似乎还有另一种选择:如果TheKeyNameMentioned的默认值为空,则可以有一个FriendlyTypeName值,其中包含类型名称。更糟的是,这个类型名称可以指向一个资源字符串。有关示例,请参阅PerfFile(.pma)的条目。另见http://msdn.microsoft.com/en-us/library/windows/desktop/dd374120(v=vs.85).aspx – dummzeuch 2012-05-01 15:11:41

0

恕我直言 - 所有这些注册表开始点(.)子项 - 对于文件扩展名。

例如,在您的情况下,.txt代表“txt”扩展名,而txtfile不以点开头。

+0

这是你的猜测(我也猜到了)还是记录在某处?我在MSDN中找到了HKEY_CLASSES_ROOT的文档,但没有说明哪些条目是扩展名,哪些不是。 – dummzeuch 2010-10-03 15:19:08

+0

这是我的“科学猜测”。我试图从点开始在HKEY_CLASSES_ROOT下添加一个新的子项。然后添加相应的东西,最后称为'SHChangeNotify'。而且 - 瞧!这工作! – valdo 2010-10-03 18:08:26

+0

我的印象是“txtfile”是一个间接的级别。你可以有例如“txtfile”和指向它的几个点式样条目,例如“.txt”,“.ini”,“.csv”然后全部指向存储共享设置的“txtfile”。 – 2010-10-04 09:41:33

1

对于命令行替代方案,Windows中包含的assoc命令行程序显示已注册的文件扩展名。

c:\> assoc 
.3g2=VLC.3g2 
.3gp=VLC.3gp 
.3gp2=VLC.3gp2 
.3gpp=VLC.3gpp 
... 

我不确定这是哪个动词。 Open也许?我也不确定哪个扩展名会出现在这个列表中。也许可以从命令行打开的文件的扩展名。

然后,为了找出可执行文件映射到每个文件类型,ftype命令将告诉:

c:\> ftype VLC.3g2 
VLC.3g2="c:\vlc.exe" --started-from-file "%1" 
+0

今天学到了新东西......对于那些想知道的人:这个命令已经存在于Windows XP。 – dummzeuch 2012-02-15 08:48:25

相关问题