Still no luck on command line parse

Francois Gouget fgouget at
Sun Feb 3 03:45:22 CST 2002

On Fri, 1 Feb 2002 lawson_whitney at wrote:
> True.  If wine sees the effect of a quote the shell has removed (spaces
> in an argument), it will quote the string with \", because if it
> doesn't, the C runtime will parse the spaces:
> [whit at giftie cmdl]$ wine cmdl.exe "quoted string"
> arg 0: /cmdl.exe/
> arg 1: /quoted string/
> [whit at giftie cmdl]$ wine cmdl.exe \"quoted string\"
> arg 0: /cmdl.exe/
> arg 1: /"quoted/
> arg 2: /string"/
> [whit at giftie cmdl]$ wine --dll msvcrt=n cmdl.exe "quoted string"
> arg 0: /cmdl.exe/
> arg 1: /quoted string/
> [whit at giftie cmdl]$ wine --dll msvcrt=n cmdl.exe \"quoted string\"
> arg 0: /cmdl.exe/
> arg 1: /"quoted/
> arg 2: /string"/
> [whit at giftie cmdl]$

   This seems all very logical and I am pleased to note that native and
builtin msvcrt behave identically. Note that your test above should
really print GetCommandLine() too.

> I know, in my example, it is actually the unix shell that is breaking
> the argument in half, but I am confident the windows C runtime startup
> routines do the same.

   Well, the thing you have to understand is that Windows and Unix
handle things very differently. On Unix the new process does not receive
a command line but a string array. Argc/argv just point to that data. On
Windows the new process receives a single string which is the raw
command line.
   So what happens in Wine is that when a process invokes CreateProcess?
The command line is broken up into argc/argv, passed down to exec, then
the Wine startup code rebuilds the command line from there. If your
process has a main then it gets the original argc/argv (almost, Wine
still has to remove the wine specific options), and if it has a WinMain,
then it gets the rebuilt command line.
   And if you invoke Wine from the command line or from any Unix
process, there is no 'original commandline'. But Wine will rebuild one
from argc/argv just like it always does. Now, the only information loss
is at the level of the spaces between the arguments on the command line.
See this email for more details:

> Unlike the unix shell, they only preserve spaces
> in an argument quoted by \", and treat " as an ordinary character.

   Not true. Here is a test I did in Windows:

c:\>main.exe "quoted string"
GetCommandLine=[main.exe "quoted string"]
main -> argc=2
0 [main.exe]
1 [quoted string]
c:\>main.exe \"quoted string\"
GetCommandLine=[main.exe \"quoted string\"]
main -> argc=3
0 [main.exe]
1 ["quoted]
2 [string"]

   Windows handles " and \" just like the Unix shells do.

   See also:

Francois Gouget         fgouget at
                Linux: It is now safe to turn on your computer.

More information about the wine-users mailing list