1

对于应用程序(例如:excel.exe),我想知道所有扩展名(例如:.xlt、.xlsx 等)在应用程序(excel.exe)中注册了什么。如何实现?

平台:视窗

语言:C/C++/C#

4

1 回答 1

1

不幸的是,文件扩展名注册可能有点复杂。没有明确的 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)值将是CLSID处理与该 ProgID 关联的所有内容的 COM 对象。您可以打开该HKEY_CLASSES_ROOT\CLSID\<CLSID>键并检查它是否有一个InprocHandler、或子键InprocHandler32,其中包含拥有该 COM 对象的 EXE 或 DLL 文件的完整路径。InprocServerInprocServer32

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

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

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

还有其他一些可能性(ShellEx 键、DDE 键、其他与 Shell 相关的 COM 对象键等),但我认为您明白了这一点。可能需要大量挖掘才能确定哪个应用程序处理给定的文件扩展名。

于 2013-03-23T00:54:34.313 回答