windows - 使用应用程序注册的扩展列表

标签 windows file file-type file-association win32-process

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

平台:Windows

语言:C/C++/C#

最佳答案

不幸的是,文件扩展名注册使用起来可能有点复杂。没有明确的 API 可以提取您正在寻找的信息。有 IQueryAssociations 接口(interface),但它并没有为您的查询方式提供很大的灵活性。它更像是一对一查询,但您正在寻找多对一查询。因此,您必须直接在注册表中挖掘该信息。

使用RegOpenKeyEx()打开HKEY_CLASSES_ROOT配置单元并使用 RegEnumKeyEx() 枚举其所有直接子项,查找以句点开头的键名称。这将为您提供已知文件扩展名的列表。

对于每个 HKEY_CLASSES_ROOT\<ext> key ,检查:

  1. 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 , InprocServerInprocServer32包含拥有该 COM 对象的 EXE 或 DLL 文件的完整路径的子项。

  2. a PersistentHandler子项。如果存在,其 (Default)值将是 CLSID处理该文件扩展名的 COM 对象的名称。您可以根据需要查看CLSID。

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

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

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

关于windows - 使用应用程序注册的扩展列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550602/

相关文章:

c++ - 如何组织我的 C++ 游戏的 Windows 和 Android 版本?

android: 在/data/data/<package>/files 的子目录下创建文件

ios - 从另一个应用程序的 "Open In"菜单打开文件

android - 如何注册我的 Android 应用程序以打开我的自定义文件扩展名,而不是所有文件

在 Ubuntu 上运行 Java 时间比在 Windows 上运行缩短 1 小时

.NET 窗口捕获

ios - iOS如何为存储在磁盘上的文件添加日期和名称元数据?

c# - 一种适用于所有文件类型的 .ashx 通用处理程序?

python - 如何在 python Windows 中使用 Linux 命令

c# - 如何在存储到文件和数据库之前更改文件名