代码之家  ›  专栏  ›  技术社区  ›  dummzeuch Stijn Sanders

从注册表读取已知的文件扩展名/类型

  •  2
  • dummzeuch Stijn Sanders  · 技术社区  · 14 年前

    我想向用户提供一个已知文件扩展名的列表,供他选择。我知道它们存储在注册表的HKEY\ U CLASSES\ U ROOT下,通常是这样的:

    .txt->(默认)=“txtfile”

    不幸的是,注册表中的这个位置还存储了很多其他键,比如文件类型(例如txtfile)和

    (我认为这无关紧要,但我正在用Delphi来编写程序。)

    4 回复  |  直到 14 年前
        1
  •  3
  •   Vantomex    14 年前

    不能保证在HKEY\ U CLASSES\ U ROOT中每个以点开头的键都是用于文件关联的,但是每个文件关联都需要创建一个以点开头的键。请参阅上的MSDN File Types 主题。

    设置文件关联

    要实现这一点,您需要执行以下复杂步骤:

    1. 枚举前面有点的每个键 . ,可以使用RegQueryInfoKey()和RegEnumKeyEx()实现此目的。

    2. 答。 如果默认值为 不是空的 , 这足以说明“前面的点键”是用于所有WindowsNT版本中的文件关联的 提到的关键字名称 .

      子键 shell\open\command 在下面 ,然后测试该键的默认值所指向的路径是否存在;如果该路径存在,则存在与该扩展关联的默认应用程序;如果该路径不存在,则默认应用程序未知。要获取文件扩展名说明,请查看 提到的关键字名称 . 要获取程序描述,首先,测试以下键是否包含与EXE文件路径相等的值名,即 HKCR\Local Settings\Software\Microsoft\Windows\Shell\MuiCache . 如果存在,则查看值数据以获取文件描述;如果不存在,则直接使用GetFileVersionInfo()获取文件描述。

      a2) 如果 根本没有 子键 在下面 提到的关键字名称 提到的关键字名称

      在Windows Vista及更高版本上,当 [答] 失败,需要额外检查。如果默认值为 ,测试键是否有名为 OpenWithProgIDs .

      • 如果 用progids打开 子键 ,使用RegEnumValue()查找满足条件的第一个遇到的值名称,即 名称 提到的关键字名称 提到的关键字名称 存在, . 读取点 a1级 a2级 接下来的步骤。

      • 如果 用progids打开 子键 ,默认应用程序未知。要获取文件扩展名说明,请查看

    希望有帮助。:-)

        2
  •  2
  •   bzlm    12 年前

    对于命令行替代方法 assoc

    c:\> assoc
    .3g2=VLC.3g2
    .3gp=VLC.3gp
    .3gp2=VLC.3gp2
    .3gpp=VLC.3gpp
    ...
    

    我不确定这是哪个动词。 Open 也许?我也不确定哪些扩展会出现在这个列表中。可能是可以从命令行打开的文件扩展名。

    为了找出哪个可执行文件映射到每个文件类型 ftype 命令将显示:

    c:\> ftype VLC.3g2
    VLC.3g2="c:\vlc.exe" --started-from-file "%1"
    
        3
  •  0
  •   valdo    14 年前

    .

    比如你的情况 .txt 表示“txt”扩展名,而 txtfile 不是从点开始的。

        4
  •  0
  •   Ondrej Kelle    14 年前

    我不知道细节,但看来你可以用 IQueryAssociations interface .