Here are the quoting rules I have discovered through trial and error. If
you follow these guidelines, MSVCRT.dll will decode the arguments properly
and pass the correct parameters to main(argc,argv).
I assume here that the result will be passed to CreateProcess.
CommandLine = all args (including exe name) joined by spaces.
for each arg
If the arg contains any of newline, tab, space or ” (double quote), then
quote it.
If the arg is a null string, then quote it.
If the arg contains double back slash \, then quote it.
Quoting in this context means:
” before and after
if you find a , then look at the next non- character. If it is a
” or the end of the string, then replace with \
embedded ” becomes ”
So:
foo bar -> “foo bar”
foobar -> foobar
foo bar -> “foo bar”
foo”bar -> “foo”bar”
foo\bar -> foo\bar
fo o\bar -> “fo o\bar”
foo bar -> “foo bar\”
fo\o\”ba\r -> “fo\o\\\”ba\r”
See the documentation for CommandLineToArgvW for more infomation.
Then call CreateProcess(0, CommandLine, …..). I always call CreateProcess
since I don’t trust exec or spawn to properly quote the arguments.