当我使用两个以上的双引号(\“)时,进程无法启动

时间:2012-05-05 09:31:42

标签: c++

我正在编写一个小的C ++程序,它涉及启动带有许多参数的.exe进程,包括发送包含空格的路径,因此需要在路径周围使用双引号。我记得使用过“逃脱角色”。

我已经尝试了很多不同的方法来启动这个过程,所以最终在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 \"" + arg2 + "\"" + arg3 + arg4 + " " + arg5 + arg6 + " " + arg6 + "\\" + arg7).c_str());

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

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

最后,我担心长度。添加第三个双引号就是打破它的原因。但是,在此之前,长度为134个字符。但是,我希望实际的启动例程长度为346个字符。这不是太久了,是吗???

我可以调试程序,获取格式化的字符串,然后粘贴到命令提示符中,并且过程完美启动。使用这些额外的引号,它的格式完美。但我无法通过C ++开始!

有谁知道这里发生了什么?这让我非常生气!非常感谢您提供任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

编辑:

我会尝试建议你两个解决方法:

  1. 而不是在您的参数周围使用",您可以用\"替换每个空格字符;要正确地进行替换,您必须指定\\"作为替换字符串;首先尝试它而不指定任何参数(仅用于命令名称),并查看是否可以扩展它;

  2. 将整个命令行写入批处理文件(好像你在Windows上),然后执行该文件。

  3. 另请查看此post about Win32 double-quote escaping rules

    试试这个:

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

    注意3 \:你想将反斜杠传递给shell(就像在命令行中一样);如果你只转义"一次,那么shell会接收它,并将其解释为字符串分隔符。你想要的是shell接收它进行转义,因此在\前面加倍\"