如果路径中有空格,ShellExecute 失败

Posted

技术标签:

【中文标题】如果路径中有空格,ShellExecute 失败【英文标题】:ShellExecute failing if spaces in Path 【发布时间】:2012-10-05 07:27:03 【问题描述】:

我有一个 Delphi 应用程序,它使用 ShellExecute 在按下按钮时调用第二个 Delphi 应用程序。

应用程序存储在同一台服务器的同一网络共享上。它们的路径格式为:

const
   JobManager = 'Z:\Apps\Application 1\Application1.exe';
   FeeManager = 'Z:\Apps\Application 2\Application2.exe';

对 ShellExecute 的调用如下:

rh := FindWindow(PChar('TMF'), PChar('Edit Job Details'));
if rh = 0 then
begin
   ShellExecute(Handle, 'open', JobManager, nil, nil, SW_SHOWNORMAL);
   ... 

由于我们有三个办公室,我们在每个办公室服务器上都有 Apps 文件夹的副本。每个服务器都有一个共享上的 Apps 文件夹,映射到“Z:”

在其中一个办公室中,我们发现了一个问题,即如果路径包含空格,则无法找到应用程序。由于应用程序是彼此的直接副本,并且在其他办公室工作,问题似乎是机器设置。

有什么想法吗?

【问题讨论】:

你试过使用双引号吗? ShellExecute(0, nil, PChar('"Z:\Apps\Application 1\Application1.exe"'), nil, nil, 0); 显示代码,并包含传递给 ShellExecute 的任何变量的值。 @Paul-Jan 已经过快速重新编译测试以删除空格并重命名问题机器上受影响的文件夹。这行得通,但不是一个长期的解决方案。我们尚未确定这是单台机器或分支机构的问题。 ShellExecute 失败时返回错误代码,代码好像没有检查。 在您的参数中。尝试使用 0 作为句柄,nil 而不是open(默认)和PChar(JobManager) 周围的双引号根本不需要AFAIK。 【参考方案1】:

使用您的lpFile 参数,您应该将JobManager 转换为PChar

ShellExecute(Handle, 'open', PChar(JobManager), nil, nil, SW_SHOWNORMAL);

注意open 动词参数也不是必需的,您可以将nillpOperation 参数一起传递(默认)。

【讨论】:

【参考方案2】:

它适用于双引号:

WinExec(PAnsiChar(AnsiString(ExtractFilePath(application.ExeName) + '\winrar.exe A  "c:\BACKUP 2016\backup_"' .....

【讨论】:

以上是关于如果路径中有空格,ShellExecute 失败的主要内容,如果未能解决你的问题,请参考以下文章

VB调用SHELL,参数路径有空格如何处理?

VB调用SHELL,参数路径有空格如何处理?

从JSON对象获取字符串值失败如果Identifier有空格android

JAVA程序命令行中有空格问题

eclipse Java工作空间 为啥说用有空格、中文的路径不好?

计划任务在路径中有空格