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