我正在编写一个小型 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++ 启动它!
有谁知道这里发生了什么?这让我非常生气!非常感谢您提供的任何帮助或建议。