我需要获取当前与当前用户的文件扩展名关联的程序的名称。如果右键单击文件并选择属性,那么我需要的是“打开方式”行右侧的程序名称。
例如对于“.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(使用前将#替换为@)