Shell 是否检索应用程序的默认关联文件类型?

Shell 是否检索应用程序的默认关联文件类型?,shell,delphi,delphi-10.1-berlin,Shell,Delphi,Delphi 10.1 Berlin,函数ShellFindExecutable允许查找与特定文件类型关联的程序: function ShellFindExecutable(const FileName, DefaultDir: string): string; var Res: HINST; Buffer: array [0..MAX_PATH-1] of Char; I: Integer; begin ResetMemory(Buffer, SizeOf(Buffer)); Res := FindExecut

函数
ShellFindExecutable
允许查找与特定文件类型关联的程序:

function ShellFindExecutable(const FileName, DefaultDir: string): string;
var
  Res: HINST;
  Buffer: array [0..MAX_PATH-1] of Char;
  I: Integer;
begin
  ResetMemory(Buffer, SizeOf(Buffer));
  Res := FindExecutable(PChar(FileName), PCharOrNil(DefaultDir), Buffer);
  if Res > 32 then
  begin
    // FindExecutable replaces #32 with #0
    for I := Low(Buffer) to High(Buffer) - 1 do
      if Buffer[I] = #0 then
        Buffer[I] := #32;
    Buffer[High(Buffer)] := #0;
    Result := Trim(Buffer);
  end
  else
    Result := '';
end;
例如:

DefProgram := ShellFindExecutable('R:\test.txt', '');
// DefProgram: C:\Program Files (x86)\Notepad++\notepad++.exe
但是,如何找到特定现有程序作为默认关联应用程序的文件类型/扩展名

德尔福10.1柏林
我不相信有专门的API函数来实现这一点。您需要遍历每个已注册的扩展,例如通过枚举HKCR中的键,并检查哪个可执行文件与open谓词关联

与使用
findaassociation
相比,我怀疑
IQueryAssociations
将更加高效和健壮


此外,您声称的
findaassociation
用null替换空格的说法根本不正确。您可以用
Result:=Buffer
替换
if
语句的主体

遍历每个注册的扩展,检查关联的应用程序是否是您的目标。此外,使用空格字符看起来完全是假的。“遍历每个注册的扩展名”似乎是合乎逻辑的。我只是想知道是否有一个明确的功能来实现这一点对于“玩空格符”你有什么建议?你说“我做了大量的测试。”。在所有情况下,如果默认程序与特定的现有文件相关联,则会正确检索默认程序。“这很可能是真的,但证明不了什么。”。字符串中不会嵌入空值,因此不会替换任何空值。换句话说,你的代码在实践中一无所获。
begin..end
块中的所有内容都在
之后,如果Res>32,那么
除了
result:=Buffer之外都是无用的
我认为@DavidHeffernan和您所说的不一样,
FindExecutable
实现了MSDN所宣称的功能,但它并没有将0替换为32,这正是您的源代码所宣称的。文件名中会有什么#0?你从哪里得到这个主意的?不太可能。我相信你能做到。你只需要浏览一下香港华润。你还有其他的一切。这是一个练习,看看使用IQueryAssociations是否更快。