对于应用程序(例如:excel.exe),我想知道所有扩展名(例如:.xlt,.xlsx等)在应用程序(excel.exe) 。如何实现它?使用应用程序注册的扩展名列表
平台:视窗
语言:C/C++/C#
对于应用程序(例如:excel.exe),我想知道所有扩展名(例如:.xlt,.xlsx等)在应用程序(excel.exe) 。如何实现它?使用应用程序注册的扩展名列表
平台:视窗
语言:C/C++/C#
不幸的是,文件扩展注册可以是一个有点复杂的工作。没有确切的API来提取您正在寻找的信息。接口有IQueryAssociations
,但它在查询方式上并没有提供很大的灵活性。它更像是1对1查询,但您正在寻找多对1查询。所以你必须直接在注册表中挖掘这些信息。
使用RegOpenKeyEx()
打开HKEY_CLASSES_ROOT
配置单元,并使用RegEnumKeyEx()
枚举其所有直接子键,查找以句点开头的键名称。这会给你已知的文件扩展名列表。
对于每个HKEY_CLASSES_ROOT\<ext>
键,检查:
包含非空字符串(Default)
值。如果存在,那就是文件扩展名的ProgID。您可以打开HKEY_CLASSES_ROOT\<ProgID>
密钥并查看它是否包含任何包含应用程序路径的shell\<verb>\command
子密钥(可能存在多个<verb>
值,因此您必须对其进行枚举)。如果没有,请检查ProgID密钥是否有CLSID
子项。如果存在,则其(Default)
值将是处理与该ProgID关联的所有内容的COM对象的CLSID
。您可以打开HKEY_CLASSES_ROOT\CLSID\<CLSID>
密钥并检查它是否包含InprocHandler
,InprocHandler32
,InprocServer
或InprocServer32
子项,其中包含拥有该COM对象的EXE或DLL文件的完整路径。
a PersistentHandler
子键。如果存在,其(Default)
值将是处理该文件扩展名的COM对象的CLSID
。您可以根据需要检查CLSID。
an OpenWithProgIds
子键。如果存在,那么它将包含ProgID列表,您可以根据需要进行检查。
an OpenWithList
子键。如果存在,它将包含已注册应用程序名称的列表。您可以打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\<AppName>
键以获取每个应用的完整路径。
还有其他一些可能性(ShellEx键,DDE键,其他Shell相关的COM对象键等),但我认为您会看到这一点。有可能很多挖掘找出哪个应用程序处理给定的文件扩展名。