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是否更快。