加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-13 22:55:13 所属栏目:Windows 来源:网络整理
导读:我需要获取当前与当前用户的文件扩展名相关联的程序的名称.如果右键单击文件并选择属性,那么我需要的是“打开方式”行右侧的程序名称. 例如对于“.xls”,我希望能够得到答案“Microsoft Office Excel”,或者用户拥有的任何程序作为打开.xls文件的默认程序.
我需要获取当前与当前用户的文件扩展名相关联的程序的名称.如果右键单击文件并选择属性,那么我需要的是“打开方式”行右侧的程序名称.

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

我已经确定它并不像进入HKEY_CLASSES_ROOT并将其取出那么容易,因为它也可以在HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER或HKEY_USERS中指定.

也许我需要知道的是Windows使用的啄食顺序来确定这个以及如何到达每个位置.当然,执行此操作的Windows API调用将是理想的.

这是一个类似的问题:
How to get icon and description from file extension using Delphi?但该问题仅回答了如何获得扩展的描述和相关程序的图标.我找不到扩展它的方法来获取相关程序的名称.

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

谢谢大家的答案.

我认为可执行文件的名称毕竟不在注册表中.在广泛浏览了将提供名称的Windows API之后,我找不到一个.

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

步骤1

获取分配给文件扩展名的可执行文件,例如使用以下函数:

uses Registry,Windows,SysUtils;

function GetAssociation(const DocFileName: string): string;
var
  FileClass: string;
  Reg: TRegistry;
begin
  Result := '';
  Reg := TRegistry.Create(KEY_EXECUTE);
  Reg.RootKey := HKEY_CLASSES_ROOT;
  FileClass := '';
  if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then
  begin
    FileClass := Reg.ReadString('');
    Reg.CloseKey;
  end;
  if FileClass <> '' then begin
    if Reg.OpenKeyReadOnly(FileClass + 'ShellOpenCommand') then
    begin
      Result := Reg.ReadString('');
      Reg.CloseKey;
    end;
  end;
  Reg.Free;
end;

(见here,或marc_s’anwser对这个问题:-)

第2步

现在,您可以从此可执行文件的版本信息中读出程序的名称!最简单的方法是使用您可以通过Google找到的TVersionInfo类,例如here.

var VersionInfo: TVersionInfo;  
VersionInfo := TVersionInfo.Create('PathToExename.exe');  
s := VersionInfo.KeyValue['Description'];

但是,您必须知道某些程序因此使用描述密钥(如RAD Studio本身或MS Excel),而其他程序则使用产品名称密钥…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读