Ste*_*lus -4 c c++ windows winapi createprocess
我想编写一个启动另一个应用程序的应用程序.像这样:
# This will launch another_app.exe
my_app.exe another_app.exe
# This will launch another_app.exe with arg1, arg and arg3 arguments
my_app.exe another_app.exe arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)
这里的问题是我正在进入char* argv[]我的main函数,但我需要将它合并到LPTSTR以便将其传递给CreateProcess.
有一个GetCommandLine函数,但我不能使用它,因为我从Linux移植代码并绑定argc/argv(否则,这对我来说是一个非常难看的黑客).
我不能轻易地手动合并参数,因为argv[i]可能包含空格.
基本上,我想反过来CommandLineToArgvW.有没有标准的方法来做到这一点?
没有与CommandLineToArgvW(). 您必须自己格式化命令行字符串。这只不过是基本的字符串连接。
Microsoft 记录了命令行参数的格式(或者至少是 VC++ 编写的应用程序所期望的格式):
Microsoft C/C++ 启动代码在解释操作系统命令行上给出的参数时使用以下规则:
参数由空格分隔,空格或制表符。
插入字符 (^) 不被识别为转义字符或分隔符。在传递给程序中的 argv 数组之前,该字符完全由操作系统中的命令行解析器处理。
由双引号 ("string") 包围的字符串被解释为单个参数,而不管其中包含的空格。带引号的字符串可以嵌入到参数中。
以反斜杠 (\") 开头的双引号被解释为文字双引号字符 (")。
反斜杠按字面解释,除非它们紧跟在双引号之前。
如果偶数个反斜杠后跟一个双引号,则在 argv 数组中为每对反斜杠放置一个反斜杠,并将双引号解释为字符串分隔符。
如果奇数个反斜杠后跟双引号,则每对反斜杠都会在argv数组中放置一个反斜杠,双引号被剩余的反斜杠“转义”,导致字面双引号(“ ) 放置在 argv 中。
编写一个接受字符串数组并将它们连接在一起的函数,对数组中的每个字符串应用与上述规则相反的规则,对您来说应该不难。
关于如何引用争论的最终答案在Daniel Colascione的博客上:
我不愿在这里引用代码,因为我不知道许可证.基本思路是:
for each single argument:
if it does not contain \t\n\v\",
just use as is
else
output "
for each character
backslashes = 0
if character is backslash
count how many successive backslashes there are
fi
if eow
output the backslashs doubled
break
else if char is "
output the backslashs doubled
output \"
else
output the backslashes (*not* doubled)
output character
fi
rof
output "
fi // needs quoting
rof // each argument
Run Code Online (Sandbox Code Playgroud)
如果需要将命令行传递给cmd.exe,请参阅文章(它不同).
我认为Microsoft C运行时库没有执行此操作的功能,这很疯狂.