[英]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>
键,请检查:
(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文件的完整路径。
PersistentHandler
子项。 如果存在,则其(Default)
值将是处理该文件扩展名的COM对象的CLSID
。 您可以根据需要检查CLSID。
一个OpenWithProgIds
子项。 如果存在,则它将包含您可以根据需要检查的ProgID列表。
一个OpenWithList
子项。 如果存在,它将包含已注册应用名称的列表。 您可以打开HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\<AppName>
键以获取每个应用程序的完整路径。
还有其他几种可能性(ShellEx键,DDE键,其他与Shell相关的COM对象键等),但我想您明白了。 可能需要进行大量挖掘,以确定哪个应用程序可以处理给定的文件扩展名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.