我想做这样的事情:
ShellExecute(0, nil, PChar('E:\generic\mpv\mpv.exe'), PChar(''+TntOpenDialog1.FileName+''), nil, SW_HIDE);
但没有发生任何事 当我尝试用这样的代码做某事时:
TntLabel1.Caption:=PChar(TntOpenDialog1.FileName);
它只显示我之前选择的第一个文件。
我该如何解决这个问题?
答案 0 :(得分:2)
您的编码不匹配:
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 + '"'
以引用参数并转义任何空格字符。