对于应用程序(例如:excel.exe),我想知道所有扩展名(例如:.xlt、.xlsx 等)在应用程序(excel.exe)中注册了什么。如何实现?
平台:视窗
语言:C/C++/C#
对于应用程序(例如:excel.exe),我想知道所有扩展名(例如:.xlt、.xlsx 等)在应用程序(excel.exe)中注册了什么。如何实现?
平台:视窗
语言: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)
值将是CLSID
处理与该 ProgID 关联的所有内容的 COM 对象。您可以打开该HKEY_CLASSES_ROOT\CLSID\<CLSID>
键并检查它是否有一个InprocHandler
、或子键InprocHandler32
,其中包含拥有该 COM 对象的 EXE 或 DLL 文件的完整路径。InprocServer
InprocServer32
一个PersistentHandler
子键。如果存在,它的(Default)
值将是CLSID
处理该文件扩展名的 COM 对象的值。您可以根据需要检查 CLSID。
一个OpenWithProgIds
子键。如果存在,那么它将包含您可以根据需要检查的 ProgID 列表。
一个OpenWithList
子键。如果存在,它将包含已注册应用程序名称的列表。您可以打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\<AppName>
密钥以获取每个应用程序的完整路径。
还有其他一些可能性(ShellEx 键、DDE 键、其他与 Shell 相关的 COM 对象键等),但我认为您明白了这一点。可能需要大量挖掘才能确定哪个应用程序处理给定的文件扩展名。