运行 用 Opendialog 打开文件并执行

Run open file with Opendialog and execute it

我想做这样的事情:

ShellExecute(0, nil, PChar('E:\generic\mpv\mpv.exe'), PChar(''+TntOpenDialog1.FileName+''), nil, SW_HIDE);

但什么也没发生。
当我尝试用这样的代码做某事时:

TntLabel1.Caption:=PChar(TntOpenDialog1.FileName);

它只显示我之前选择的文件的第一个字母。
我该如何解决这个问题?

您的编码不匹配:

  • TntOpenDialog1.FileName 是 UTF-16 编码。
  • PCharPAnsiChar 的别名,ANSI 也是。
  • ShellExecuteShellExecuteA 的别名,ANSI 变体。

这意味着您正在将 UTF-16 数据传递给需要 ANSI 编码文本的函数。因此观察到的行为。

PChar 替换为 PWideChar 并将 ShellExecute 替换为 ShellExecuteW 以更正该不匹配。

首先,为了让自己确信这就是问题所在,请将调试代码更改为:

TntLabel1.Caption := PWideChar(TntOpenDialog1.FileName);

如果您希望能够正确报告错误,请使用ShellExecuteExW。使用CreateProcessW直接创建流程,避免涉及shell.

如果

'' + TntOpenDialog1.FileName + ''

不是你写问题时的错别字,那也是一个问题。因为 '' 只是空字符串。

换句话说,该表达式等于

TntOpenDialog1.FileName

您需要使用:

'"' + TntOpenDialog1.FileName + '"'

为了引用参数并转义任何 space 字符。

如果你在文件路径中 space 期待,你不能传递像 ''+myparam+''

这样的参数
var
myparam : AnsiString;
begin
myparam := 'test file nr 10.txt';
ShellExecute(0, nil, PChar('...'), PChar(''+myparam+''), nil, SW_HIDE);

ParamStr(1) 只会给你 test !!

如果路径中有 spaces,请像这样使用它:

ShellExecute(0, nil, PChar('...'), PChar('"'+myparam+'"'), nil, SW_HIDE);

试试看。 但要注意从 FFileName: WideString 到 AnsiString 的转换,信息可能会丢失。仅当文件路径中没有出现特殊字符时才使用此选项。

...
var
AnsiStr : AnsiString;
...
begin

AnsiStr := TntOpenDialog1.FileName;
ShellExecute(0, nil, PChar('E:\generic\mpv\mpv.exe'), PChar('"'+AnsiStr+'"'), nil, SW_HIDE);