2013-03-21 48 views

回答

1

不幸的是,文件扩展注册可以是一个有点复杂的工作。没有确切的API来提取您正在寻找的信息。接口有IQueryAssociations,但它在查询方式上并没有提供很大的灵活性。它更像是1对1查询,但您正在寻找多对1查询。所以你必须直接在注册表中挖掘这些信息。

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

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

  1. 包含非空字符串(Default)值。如果存在,那就是文件扩展名的ProgID。您可以打开HKEY_CLASSES_ROOT\<ProgID>密钥并查看它是否包含任何包含应用程序路径的shell\<verb>\command子密钥(可能存在多个<verb>值,因此您必须对其进行枚举)。如果没有,请检查ProgID密钥是否有CLSID子项。如果存在,则其(Default)值将是处理与该ProgID关联的所有内容的COM对象的CLSID。您可以打开HKEY_CLASSES_ROOT\CLSID\<CLSID>密钥并检查它是否包含InprocHandler,InprocHandler32,InprocServerInprocServer32子项,其中包含拥有该COM对象的EXE或DLL文件的完整路径。

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

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

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

还有其他一些可能性(ShellEx键,DDE键,其他Shell相关的COM对象键等),但我认为您会看到这一点。有可能很多挖掘找出哪个应用程序处理给定的文件扩展名。