运行 用 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 编码。
PChar
是 PAnsiChar
的别名,ANSI 也是。
ShellExecute
是 ShellExecuteA
的别名,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);
我想做这样的事情:
ShellExecute(0, nil, PChar('E:\generic\mpv\mpv.exe'), PChar(''+TntOpenDialog1.FileName+''), nil, SW_HIDE);
但什么也没发生。
当我尝试用这样的代码做某事时:
TntLabel1.Caption:=PChar(TntOpenDialog1.FileName);
它只显示我之前选择的文件的第一个字母。
我该如何解决这个问题?
您的编码不匹配:
TntOpenDialog1.FileName
是 UTF-16 编码。PChar
是PAnsiChar
的别名,ANSI 也是。ShellExecute
是ShellExecuteA
的别名,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);