从注册表中读取已知的文件扩展名/类型

时间:2010-10-03 11:31:06

标签: windows delphi registry

我想向用户显示已知文件扩展名列表供他选择。我知道这些存储在HKEY_CLASSES_ROOT下的注册表中,通常是这样的:

.txt - > (默认)= “txtfile”

其中txtfile包含有关相关程序的信息等。

不幸的是,注册表中的位置还存储了许多其他键,例如文件类型(例如txtfile)和

之类的条目

CAPICOM.Certificates(无论是什么)

如何确定哪些条目是文件扩展名?或者是否有不同的方法来获得这些扩展,如API函数?

(我认为这不重要,但我正在使用Delphi进行该程序。)

4 个答案:

答案 0 :(得分:3)

无法保证在HKEY_CLASSES_ROOT中以点开头的每个键都用于文件关联,但每个文件关联都需要创建一个以点开头的键。请参阅File Types主题上的MSDN。

AFAIK,我在这里描述的方法符合Windows 设置文件关联功能如何工作以获取所有已知文件类型的列表。这是基于我以前的观察,当我深入研究这个主题时。

要实现这一目标,您需要执行以下复杂步骤:

  1. 枚举前面带有点.的每个键,您可以使用RegQueryInfoKey()和RegEnumKeyEx()来实现此目的。

  2. 在以点开头的每个键中,查看默认值数据:

    a。如果默认值为非空这足以表明“前面的点密钥”用于所有Windows NT中的文件关联版本,然后尝试打开值数据所提到的密钥名称,只需说出 TheKeyNameMentioned

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

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

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

    • 如果OpenWithProgIDs子键存在,请使用RegEnumValue()查找符合条件的第一个遇到的值名称,即名称值名称必须指向与值名称相同的现有键(只是说 TheKeyNameMentioned 。)。如果存在 TheKeyNameMentioned 这足以表明“前面的点密钥”用于文件关联。读取点 a1 a2 用于后续步骤。

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

  3. 希望有所帮助。 : - )

答案 1 :(得分: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"

答案 2 :(得分:0)

恕我直言 - 所有那些以点(.)开头的注册表子项都是用于文件扩展名。

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

答案 3 :(得分:0)

我不知道细节,但似乎你可以使用IQueryAssociations interface