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

2024-04-23

我想向用户提供已知文件扩展名的列表供他选择。我知道它们通常存储在注册表中的 HKEY_CLASSES_ROOT 下,如下所示:

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

其中 txtfile 包含有关关联程序等的信息。

不幸的是,注册表中的该位置还存储了许多其他键,例如文件类型(例如 txtfile)和条目,例如

CAPICOM.证书(无论是什么)

如何确定哪些条目是文件扩展名?或者有没有像 API 函数一样获得这些扩展的不同方法?

(我认为这并不重要,但我正在使用 Delphi 来编写该程序。)


不能保证 HKEY_CLASSES_ROOT 中前面带有点的每个键都用于文件关联,但每个文件关联都需要创建前面带有点的键。请参阅 MSDN 上文件类型 http://msdn.microsoft.com/en-us/library/cc144148(VS.85).aspx#fa_register_type topic.

AFAIK,我在这里描述的方法符合Windows的方式设置文件关联该功能可获取所有已知文件类型的列表。这是基于我以前研究这个主题时的观察。

为此,您需要执行以下复杂的步骤:

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

  2. 在每个前面有一个点的键中,查看默认值数据:

    a.如果默认值为不是空的, 这足以表明“前面的点键”用于所有 Windows NT 版本中的文件关联,然后尝试打开值数据提到的键名称,只是说提到的键名.

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

    a2) If 没有子项shell\open\command under 提到的键名,则默认应用程序未知。要获取文件扩展名描述,请查看默认值提到的键名.

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

    • If OpenWithProgIDs subkey exists,使用RegEnumValue()查找第一个遇到的符合条件的值名称,即name值名称的必须指向现有的键(只是说提到的键名.) 与值名称同名。如果提到的键名存在,这足以表明“前面的点键”用于文件关联。读点a1 and a2以便进行下一步。

    • If OpenWithProgIDs subkey 不存在,默认应用程序未知。要获取文件扩展名描述,请查看默认值提到的键名.

希望有帮助。 :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • node.js http 服务器,检测客户端何时断开连接

    我使用express 和node js 作为http 服务器 我存储响应对象 以便可以将事件流式传输到该通道上的客户端 有没有办法检测客户端何时断开连接 当我杀死我的客户端时 我仍然可以写入响应对象 而不会收到任何类型的异常 错误 看起来只
  • 安装 Rails 版本 3.2.15 时出现“Gem::RemoteFetcher::UnknownHostError”

    我之前已经在实时 ubuntu USB 上成功安装了 Rails 3 2 15 并具有数据持久性 现在我已经习惯了操作系统 Ubuntu 12 04 LTS 我已经将它安装在笔记本电脑上 并且正在安装我在实时 USB 中使用的东西 长话短说
  • 更改控制台大小

    Delphi中的简单问题 我创建了一个控制台应用程序 如果控制台窗口的高度少于 80 行 我需要将其高度更改为 80 行 这需要从代码中完成 并且实际上是在代码内有条件的 即 当发生错误时 它会增加控制台的大小 以便整个 巨大的 错误报告可
  • NSIS:在标签中插入链接

    假设我有以下 nsDialog 标签 单击 接受 即表示我同意示例的许可协议和隐私政策 您可以访问需要使用个人信息的功能 欲了解更多信息 请下载示例的内容政策 我想在此标签中插入链接 如下所示 单击 接受 即表示我同意示例的内容许可协议 h
  • 动画 GIF 作为 THREE.js 中的纹理

    我正在寻找一种在 THREE js 中使用 GIF 动画作为纹理的方法 我目前可以加载纹理 甚至是 GIF 格式 但它无法播放动画 有什么办法可以做到吗 我发现了一些像这样的链接 https github com JordiRos GLGi
  • 如何从 JavaScript 变量保存 png

    我在 javascript 变量中有一个以 base64 编码的图像 data image png base64 base64 data 编辑 我需要将该文件保存到磁盘而不要求访问者右键单击 编辑 是否可以 如何 提前致谢 此致 我知道这个
  • 如何从 Rails 中的 RSpec 测试调用应用程序帮助器方法?

    标题是不言自明的 我尝试过的一切都导致了 未定义的方法 澄清一下 我并不是想测试辅助方法 我正在尝试在集成测试中使用辅助方法 您只需在测试中包含相关的帮助程序模块即可使方法可用 describe foo do include ActionV
  • Knockout:避免绑定中的循环更新

    我有一个与接口交互的自定义 绑定Scribe https github com guardian scribe 一个内容可编辑的所见即所得编辑器 当编辑器内容发生变化时 它会更新关联的可观察量 并在关联的可观察量发生变化时更新编辑器 ko
  • 将属性添加到对象数组

    我有一个对象数组 如下所示 Object Results Array 2 Results Array 2 0 1 0 Object id 1 name Rick 1 Object id 2 name david 我想向该对象数组的每个元素添
  • 如何在 Node.js 中无限读取行

    while 1 rl question Command function answer console log answer 刚刚尝试了这段代码 但不是一一输入 而是闪烁 命令 行 我知道 Node js 是非阻塞的 但我不知道如何解决这个
  • 是否可以在 Flutter 的 IconButton 中使用 DropDownButton?

    Update override Widget build BuildContext context return new Container height MediaQuery of context size height child Si
  • 数据湖分析 U-SQL 提取速度(本地与 Azure)

    一直在研究使用 Azure Data Lake Analytics 功能来尝试操作我存储在 Azure Blob 存储中的一些 Gzip 处理的 xml 数据 但我遇到了一个有趣的问题 本质上 当在本地使用 U SQL 处理 500 个 x
  • WordPress:获取自定义类型的所有帖子

    我有这个奇怪的问题 我想获取所有自定义类型的帖子 这是我的代码片段 query new WP Query array post type gt custom post status gt publish while query gt hav
  • ServerEndpoint 和 web.xml

    我有一些 Soap REST servlet 现在还有一个 WebSocket ServerEndpoint game public class WebSocketgame 我有下一个麻烦 如果 web xml 存在 WebSocket 不
  • 使用 google/facebook 和自定义 Nodejs 服务器进行 Firebase 身份验证

    我正在尝试将 firebase 身份验证与我的自定义 Nodejs 服务器集成 电子邮件 密码策略非常简单 因为管理 sdk 支持所需的所有操作 然而 对于提供商来说 文档指示我们手动处理登录流程 https firebase google
  • AttributeError:“模块”对象没有 tf.app.run() 的属性“main”

    我正在尝试测试一个简短的程序 该程序非常简单 如下所示 import numpy as np import tensorflow as tf flags tf app flags FLAGS flags FLAGS import tenso
  • SQL 规范是否提供了一种更好的方法来对两个集合进行异或运算?

    我有一个结果集A即 10 行 1 10 1 2 3 4 5 6 7 8 9 10 and B这是 10 行 由偶数 1 20 组成 2 4 6 8 10 12 14 16 18 20 我想找到一组中的元素 但不是同时找到两者中的元素 行中没
  • 跨子域和主机的 Cookie

    在我使用开发环境和语言组合编写的应用程序中 我需要从两个不同的子域 每个子域位于单独的主机上 访问 cookie cookie 正在设置www mydomain com使用下面的 PHP 代码 我尝试从distant mydomain co
  • 如何以编程方式查找 Swift 的版本?

    我知道我可以找到我现在正在运行的 Swift 版本 恢复到终端并输入 xcrun swift version Swift version 1 1 swift 600 0 57 4 Target x86 64 apple darwin13 4
  • 从注册表中读取已知的文件扩展名/类型

    我想向用户提供已知文件扩展名的列表供他选择 我知道它们通常存储在注册表中的 HKEY CLASSES ROOT 下 如下所示 txt gt 默认 txtfile 其中 txtfile 包含有关关联程序等的信息 不幸的是 注册表中的该位置还存