使用Opendialog运行打开的文件并执行它

时间:2015-09-09 15:13:38

标签: delphi delphi-7

我想做这样的事情:

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

但没有发生任何事 当我尝试用这样的代码做某事时:

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

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

1 个答案:

答案 0 :(得分:2)

您的编码不匹配:

  • 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 + '"'

以引用参数并转义任何空格字符。