我想向用户提供已知文件扩展名的列表供他选择。我知道它们通常存储在注册表中的 HKEY_CLASSES_ROOT 下,如下所示:
.txt ->(默认)=“txtfile”
其中 txtfile 包含有关关联程序等的信息。
不幸的是,注册表中的该位置还存储了许多其他键,例如文件类型(例如 txtfile)和条目,例如
CAPICOM.证书(无论是什么)
如何确定哪些条目是文件扩展名?或者有没有像 API 函数一样获得这些扩展的不同方法?
(我认为这并不重要,但我正在使用 Delphi 来编写该程序。)
不能保证 HKEY_CLASSES_ROOT 中前面带有点的每个键都用于文件关联,但每个文件关联都需要创建前面带有点的键。请参阅 MSDN 上文件类型 http://msdn.microsoft.com/en-us/library/cc144148(VS.85).aspx#fa_register_type topic.
AFAIK,我在这里描述的方法符合Windows的方式设置文件关联该功能可获取所有已知文件类型的列表。这是基于我以前研究这个主题时的观察。
为此,您需要执行以下复杂的步骤:
枚举前面有一个点的每个键.
,您可以使用 RegQueryInfoKey() 和 RegEnumKeyEx() 来实现此目的。
-
在每个前面有一个点的键中,查看默认值数据:
a.如果默认值为不是空的, 这足以表明“前面的点键”用于所有 Windows NT 版本中的文件关联,然后尝试打开值数据提到的键名称,只是说提到的键名.
a1) If there is子项shell\open\command
under 提到的键名,然后测试这个key的默认值所指向的路径是否存在;如果该路径存在,则存在与该扩展关联的默认应用程序;如果路径不存在,则默认应用程序未知。要获取文件扩展名描述,请查看默认值提到的键名。要获取程序描述,首先测试以下键是否包含与EXE文件路径相同的值名称,即HKCR\Local Settings\Software\Microsoft\Windows\Shell\MuiCache
。如果存在,则查看值数据以获取文件描述;如果不存在,则直接使用 GetFileVersionInfo() 获取文件描述。
a2) If 没有子项shell\open\command
under 提到的键名,则默认应用程序未知。要获取文件扩展名描述,请查看默认值提到的键名.
b.在 Windows Vista 及更高版本上,当点[a]失败,需要额外检查。如果默认值为empty,测试该键是否有名为的子键OpenWithProgIDs
.
If OpenWithProgIDs
subkey exists,使用RegEnumValue()查找第一个遇到的符合条件的值名称,即name值名称的必须指向现有的键(只是说提到的键名.) 与值名称同名。如果提到的键名存在,这足以表明“前面的点键”用于文件关联。读点a1 and a2以便进行下一步。
If OpenWithProgIDs
subkey 不存在,默认应用程序未知。要获取文件扩展名描述,请查看默认值提到的键名.
希望有帮助。 :-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)