从Delphi程序在Edge中打开本地文件



我有以下过程,应该从Delphi程序调用Edge并打开sFileName 中给定地址的本地文件

procedure OpenFileInEdge (
const Handle:HWND;
const sFileName: string); 
begin
ShellExecute (Handle, 'open', Pchar('"shell:AppsfolderMicrosoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"'),
Pchar ('"' + sFileName + '"'), nil, sw_ShowNormal);
end;

它运行良好,除非文件名本身或任何父映射的名称中有空格。当存在空间时;E: \Temp\文件名.html"Edge将打开两个选项卡,而不是一个具有指定文件名的选项卡,一个具有名称";E: \临时\文件"另一个带有";Name.html";。

当我将文件从Win Explorer拖动到Edge时,它将地址显示为";E: \Temp\文件%20Name.html"。因此,我已将上述过程中的调用更改为:

Pchar (StringReplace (sFileName, ' ', '%20', [rfReplaceAll])), nil, sw_ShowNormal);

现在Edge打开一个具有以下地址的选项卡:";E: \Temp\File%2520Name.html">

我已经检查过,替换后的文件名确实是";E: \Temp\File%20Name.html";,所以在从Delphi到Edge的过程中;E: \Temp\File%2520Name.html";。

好吧,25是%的十六进制代码,所以我如何告诉Windows不要将%转换为%25?

我找到了几个建议,我尝试过:

  • 将文件名置于单引号中-结果与双引号相同
  • 将不同的转义符放在%:%/%^%%&%前面
  • 将%置于引号中:"%">

当然是

添加"文件:";前缀并没有改变不需要的行为,也没有从空白更改为%20,而且我不想在默认浏览器中打开文档,特别是在Edge中(默认为Chrome(。

有帮助的不是再加一对双引号,而是再加两对双引号。现在的工作程序如下:

procedure OpenFileInEdge (
const Handle:HWND;
const sFileName: string);
begin
ShellExecute (Handle, 'open', Pchar('"shell:AppsfolderMicrosoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge"'),
Pchar ('"""' + sFileName + '"""'), nil, sw_ShowNormal);
end;

尝试在文件路径参数中添加file:///前缀,并在中加双引号

"file:///E:TempFile Name.html"

最新更新