使用两个以上双引号(\";)时进程未启动 我编写了一个小型C++程序,它涉及用许多参数启动.exe进程,包括发送包含空格的路径,因此需要在路径周围加上双引号。我记得使用“转义”字符

使用两个以上双引号(\";)时进程未启动 我编写了一个小型C++程序,它涉及用许多参数启动.exe进程,包括发送包含空格的路径,因此需要在路径周围加上双引号。我记得使用“转义”字符,c++,C++,我尝试了很多不同的方法来启动这个过程,因此最终选择了system(),只是为了让启动代码尽可能简单 我有以下代码: string ExpandEnvironmentVariables(string input) { char buffer[512]; ExpandEnvironmentStringsA(input.c_str(), buffer, sizeof(buffer) / sizeof(*buffer)); return buffer; } 据我所知,这很好用

我尝试了很多不同的方法来启动这个过程,因此最终选择了system(),只是为了让启动代码尽可能简单

我有以下代码:

string ExpandEnvironmentVariables(string input)
{
    char buffer[512];
    ExpandEnvironmentStringsA(input.c_str(), buffer, sizeof(buffer) / sizeof(*buffer));
    return buffer;
}
据我所知,这很好用

下面是我用来启动进程的代码(所有变量都是std::string)。这个代码很好用,但是它并不包含我想要传递的所有参数

system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c ").c_str());
这个不行:

system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \"").c_str());
请注意,添加了额外的双引号。这不是进程出错,而是进程从未启动

我正在使用Process Monitor来检测进程何时启动,并且在我将多余的双引号添加到进程中时,进程中就不会出现Process.exe。但是,以下是我想要启动进程的内容(这也不起作用)

我甚至尝试将双引号配对,但这也不起作用:

system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \"test\"").c_str());
最后,我关心的是长度。添加第三个双引号会破坏它。然而,在此之前,长度是134个字符。然而,我希望实际的开始例程是346个字符。这不是太长,是吗

我可以调试程序,把格式化的字符串,粘贴到命令提示符,过程就完美地开始了。用这些额外的引文,格式是完美的,但是我不能通过C++来启动! 有人知道这里发生了什么吗?这让我非常生气!非常感谢您提供的任何帮助或建议。

编辑:

我将尝试向您推荐两种解决方法:

  • 您可以用
    \“
    替换每个空格字符,而不是在参数周围使用
    ;要正确替换,您必须将
    \\“
    指定为替换字符串;首先尝试一下,不要指定任何参数(仅用于命令名),看看是否可以扩展它

  • 将整个命令行写入批处理文件(看起来您在Windows上),然后执行该文件

  • 也检查一下这个

    试试这个:

    system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \\\"").c_str());
    

    注意3
    \
    :您希望将反斜杠传递给shell(就像在命令行上一样);如果您只转义一次,“”,则shell会将其作为字符串分隔符接收,并将其解释为字符串分隔符。您需要的是,shell会将其转义,因此,
    \
    前面的双
    \

    编写使用转义字符将转义字符传递给另一个进程的代码可能会变得非常棘手。想象一个生成文件生成一个调用
    系统的代码。现在假设shell调用是一个
    printf
    <代码>'\'
    到处都是。肯定有办法将参数作为数组传递!?!类似execv的东西可以避免整个逃跑问题。如果Windows只提供了一个字符串,那么将命令行作为一个字符串进行启动只是一个劣质的API。同样感谢你们两位的帮助,这帮助我最终找到了解决方案。非常感谢你们的帮助。不幸的是,它仍然不起作用。我个人肯定做错了什么,但我不明白。。。我已经向您发送了我的实际代码,我只重命名了变量,没有其他。我想对于一个不太好的程序员会犯什么错误,你不会有更多的想法吧!?不过,非常感谢。很抱歉,除了不依赖进程监视器之外,我没有其他建议:它将具有有限的分辨率,并且如果您的进程很快死亡,它可能无法检测到它。无论如何,我将在我的答案中添加一个解决方法的想法…最后,我使用ShellExecute成功地使它工作。我不太清楚为什么这个和其他的不一样——很可能是我在使用其他的时候做错了!无论如何,非常感谢你的帮助和建议,从中我学到了很多,并最终找到了解决方案。再次感谢:)
    system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \\\"").c_str());