繁体   English   中英

在应用程序中注册的扩展名列表

[英]List of extensions registered with an application

对于一个应用程序(例如:excel.exe),我想知道所有扩展名(例如:.xlt,.xlsx等)都已向应用程序(excel.exe)注册。 如何实现呢?

平台:Windows

语言:C / C ++ / C#

不幸的是,文件扩展名注册的使用可能有点复杂。 没有确定的API可以提取您要查找的信息。 IQueryAssociations接口,但是它在查询方式上没有给您很大的灵活性。 它更像是一对一查询,但是您正在寻找“多对一”查询。 因此,您将必须直接在注册表中查找该信息。

使用RegOpenKeyEx()打开HKEY_CLASSES_ROOT配置单元,并使用RegEnumKeyEx()枚举其所有直接子键,查找以句点开头的键名。 这将为您提供已知文件扩展名的列表。

对于每个HKEY_CLASSES_ROOT\\<ext>键,请检查:

  1. (Default)值,其中包含非空白字符串。 如果存在,则为文件扩展名的ProgID。 您可以打开HKEY_CLASSES_ROOT\\<ProgID>键,查看它是否具有包含应用程序路径的shell\\<verb>\\command子键(可能存在多个<verb>值,因此您必须枚举它们)。 如果没有,请检查ProgID项是否具有CLSID子项。 如果存在,则其(Default)值将是处理与该ProgID相关联的所有内容的COM对象的CLSID 您可以打开HKEY_CLASSES_ROOT\\CLSID\\<CLSID>项,并检查它是否具有InprocHandlerInprocHandler32InprocServerInprocServer32子项,该子项包含拥有该COM对象的EXE或DLL文件的完整路径。

  2. PersistentHandler子项。 如果存在,则其(Default)值将是处理该文件扩展名的COM对象的CLSID 您可以根据需要检查CLSID。

  3. 一个OpenWithProgIds子项。 如果存在,则它将包含您可以根据需要检查的ProgID列表。

  4. 一个OpenWithList子项。 如果存在,它将包含已注册应用名称的列表。 您可以打开HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\<AppName>键以获取每个应用程序的完整路径。

还有其他几种可能性(ShellEx键,DDE键,其他与Shell相关的COM对象键等),但我想您明白了。 可能需要进行大量挖掘,以确定哪个应用程序可以处理给定的文件扩展名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM