如何使用 Delphi 获取与文件扩展名关联的程序名称?

2024-01-02

我需要获取当前与当前用户的文件扩展名关联的程序的名称。如果右键单击文件并选择属性,那么我需要的是“打开方式”行右侧的程序名称。

例如对于“.xls”,我希望能够获得答案“Microsoft Office Excel”,或者用户作为默认程序打开 .xls 文件的任何程序。

我确定这并不像进入 HKEY_CLASSES_ROOT 并将其挑选出来那么容易,因为它也可能在 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 或 HKEY_USERS 中指定。

也许我需要知道的是 Windows 用来确定这一点的优先顺序以及如何到达每个位置。当然,执行此操作的 Windows API 调用将是理想的选择。

这是一个类似的问题:如何使用Delphi从文件扩展名中获取图标和描述? https://stackoverflow.com/questions/829843/但该问题仅回答了如何获取扩展程序的描述和关联程序的图标。我找不到一种方法来扩展它以获取关联程序的名称。

我正在使用 Delphi 2009,需要一个适用于 Windows XP、Vista 和 7 的解决方案。


谢谢大家的答案。

我似乎相信可执行文件的名称毕竟不在注册表中。在广泛寻找可以给出该名称的 Windows API 后,我找不到一个。

我认为Mef的回答是最好的。从程序可执行文件中包含的信息中获取可执行文件的名称。


后续:我发现David Hefferman 对“如何使用默认文本编辑器打开文件?”的回答 https://stackoverflow.com/a/16941705/30176为使用不同扩展名的默认程序打开一个程序提供了一种出色的解决方案。


当有 API 函数可以满足您的需要时,请不要在注册表中进行探索。

在你的情况下,你想要AssocQueryString http://msdn.microsoft.com/en-us/library/bb773471.aspx。您可以给它文件扩展名,它会告诉您注册来处理该扩展名的程序(AssocStr_Executable)。如果您打算running该程序打开文档,那么您确实需要命令字符串而不仅仅是可执行文件;AssocQueryString也可以给你(AssocStr_Command)。它还可以告诉您文档类型,例如 Windows 资源管理器中显示的内容,例如“文本文档”或“Zip 存档”(AssocStr_FriendlyDocName).

该 API 函数是一个包装器IQueryAssociations http://msdn.microsoft.com/en-us/library/bb761400.aspx界面。如果您正在寻找来自多种文件类型的程序,或查找与单一类型关联的大量字符串,您可能希望实例化该接口并重用它,而不是一遍又一遍地调用 API 函数。

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

如何使用 Delphi 获取与文件扩展名关联的程序名称? 的相关文章

随机推荐

  • python:如何将列表中的每个值与另一个列表中的所有值相乘

    EDIT2 我已经删除了其余的代码 这样我就不会破坏解决方案 感谢您的帮助 编辑 我包含了我的整个代码 我不想包含它 因为我不想破坏任何自己尝试这个问题的人的解决方案 但我需要帮助 所以就在这里 我通过执行以下操作手动完成此操作 但我希望它
  • 等号(=) 和 IN 与子查询的区别

    我有一个查询需要 20 秒才能执行 请按照我的查询操作 SELECT MATLIGA COD MAT FAMILIA FROM ORCAMENTOS dbo OR 1INSUMOS INSUMOS INNER JOIN ORCAMENTOS
  • SQLite3和多进程

    当多个进程访问同一个SQLite数据库文件时 如何保证正确性 首先 避免并发访问sqlite数据库文件 并发性是 sqlite 的弱点之一 如果您有高度并发的应用程序 请考虑使用其他数据库引擎 如果您无法避免并发或删除 sqlite 请包装
  • XPath 不适用于动态 HTML 文档

    注意 这个问题及其答案对于大多数 所有支持 XPath 的编程语言和库都有效 而不仅仅是 JavaScript 使用以下代码创建一个非常简单的 HTML 页面 实际代码加载远程页面 但我试图将您的注意力集中在这里的主要问题上 var dt
  • 无法识别的选择器发送到实例 UIViewController

    我不断收到错误 NSInvalidArgumentException 原因 UIViewController setPhotoCellName 无法识别的选择器发送到实例 当我进入准备segue调用时 目前我有 TabBarControll
  • 如何在 Grails 中外部化自定义约束?

    我想将自定义约束验证器闭包保留在属性的约束定义之外 因为这样更容易阅读和重用 但我做错了 我正在尝试这样做 class City String name static constraints name nullable false blan
  • 更新模型并将更新操作与 UI 绑定

    我目前已经使用 AngularJS 开发了一个内容表 该表将基于 Angular 服务 模型 进行填充 该模型调用 Web 服务并返回列表 并使用 ng repeat 并创建一个表及其所有内容 目前一切正常 但我有一个小问题 在表的一部分
  • 表达式 awk、python 中的无效字符

    我有一个如下所示的命令 ps v p 2585 awk if 9 MEM print 9 现在这在 bash 中运行得很好 它只需要你给它的任何 pid 的内存部分 不过我现在正在尝试用 python 实现它 但遇到了一些问题 这是我在 p
  • 尝试从 Reddit API 获取数据时出现 403 错误

    我正在使用 oAuth 来验证我的应用程序 我设法获得了代码 access token 和refresh token 因此下一步将尝试获取有关当前用户的信息 public async void GetCurrentUser using va
  • Twitter bootstrap:带有图标但没有文本的按钮高度错误

    There are two buttons on simple html page with attached twitter bootstrap 2 3 with and without text If I open it button
  • JOptionPane 按钮和自定义面板之间的通信

    我通过使用我想要的字段构建 JPanel 并将其添加到 JOption 窗格来创建多输入对话框 JMainPanel mainPanel new JMainPanel mensaje parametros mgr int i JOption
  • rowsTotal、recordsFiltered 解释 Jquery DataTable

    我正在阅读数据表文档 但找不到答案 我的问题是 我有一个包含 10 000 行的表 我按州进行搜索 结果是 3000 行 从 3000 行开始 我将每页显示 20 行 recordsTotal 这里应该有什么值 recordsFiltere
  • 获取逗号分隔字符串列之间的公共元素(来自同一行),保留行名

    我有一个数据框 其中一些列包含逗号分隔的字符串 colA colB 1 a b c d b e 2 f g h f g m p 3 i j k f o j 我想获得对应于同一行的两列之间的共同元素 所以我想要的输出是 colA colB 1
  • 当名称不匹配时 MVC UpdateModel

    假设您有一个看起来像这样的模型 public class MyClass public string Name get set public DateTime MyDate get set Visual Studio 为您提供的默认编辑模板
  • AJAX 请求时清空 $_SESSION 超全局变量,但保留会话 ID

    我遇到问题 SESSIONAJAX 请求上的超级全局 session start 函数在任何会话编码之前调用 调用代码和AJAX响应代码中的Session ID也是相同的 通过echoing测试session id 在两个脚本中 AJAX
  • 如何使用有效的 AWS 配置文件配置 Alexa Ask-cli?

    在使用了developer amazon com和aws amazon com的漂亮浏览器GUI之后 事情变得越来越严重 现在我想使用ask cli来初始化Alexa技能及其lambda函数 当我想要的时候ask init 它告诉我 我应该
  • Unity 3D:资源包与资源文件夹与 www.Texture

    因此 我在论坛上阅读了一些有关 Unity 3D 中的 AssetBundles 和 Resources 文件夹的内容 但我无法找出我所面临问题的最佳解决方案 问题是这样的 我有一个专为独立设计的程序 可以加载充满 png 和 jpg 图像
  • 具有手动内存管理的解释语言?

    哪些解释型语言无指针语言 IE Python Java Perl PHP Ruby Javascript 等 具有手动内存管理功能 我不记得曾经听说过 解释型语言主要担心的不是垃圾收集的非确定性延迟 或没有足够延迟时的空间复杂性 吗 那么为
  • MPAndroidChart - 自 v2 以来删除顶部边框/轴

    我将 MPAndroidChart 从 v1 7 升级到 v2 并且必须更改一些内容 新的事情之一是我现在似乎有一个最大值的顶部边框 我试图隐藏所有边框的代码是这样的 LineChart graph LineChart connection
  • 如何使用 Delphi 获取与文件扩展名关联的程序名称?

    我需要获取当前与当前用户的文件扩展名关联的程序的名称 如果右键单击文件并选择属性 那么我需要的是 打开方式 行右侧的程序名称 例如对于 xls 我希望能够获得答案 Microsoft Office Excel 或者用户作为默认程序打开 xl