我想向用户显示已知文件扩展名列表供他选择。我知道这些存储在HKEY_CLASSES_ROOT下的注册表中,通常是这样的:
.txt - > (默认)= “txtfile”
其中txtfile包含有关相关程序的信息等。
不幸的是,注册表中的位置还存储了许多其他键,例如文件类型(例如txtfile)和
之类的条目CAPICOM.Certificates(无论是什么)
如何确定哪些条目是文件扩展名?或者是否有不同的方法来获得这些扩展,如API函数?
(我认为这不重要,但我正在使用Delphi进行该程序。)
答案 0 :(得分:3)
无法保证在HKEY_CLASSES_ROOT中以点开头的每个键都用于文件关联,但每个文件关联都需要创建一个以点开头的键。请参阅File Types主题上的MSDN。
AFAIK,我在这里描述的方法符合Windows 设置文件关联功能如何工作以获取所有已知文件类型的列表。这是基于我以前的观察,当我深入研究这个主题时。
要实现这一目标,您需要执行以下复杂步骤:
枚举前面带有点.
的每个键,您可以使用RegQueryInfoKey()和RegEnumKeyEx()来实现此目的。
在以点开头的每个键中,查看默认值数据:
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 的默认值。
希望有所帮助。 : - )
答案 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。