The CommandLineToArgvW
function does some basic
command line parsing.
A customer reported that it was producing strange results when
you passed an empty string as the first parameter:
LPWSTR argv = CommandLineToArgvW(L"", &argc);
Well, okay, yeah, but huh?
The first parameter to CommandLineToArgvW
is supposed
to be the value returned by GetCommandLineW
.
That’s the command line, and that’s what
CommandLineToArgvW
was designed to parse.
If you pass something else, then
CommandLineToArgvW
will try to cope,
but it’s not really doing what it was designed for.
It turns out that the customer was mistakenly passing the
lpCmdLine
parameter that was passed to the
wWinMain
function:
int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { int argc; LPWSTR argv = CommandLineToArgvW(lpCmdLine, &argc); ... }
That command line is not in the format that CommandLineToArgvW
expects.
The
CommandLineToArgvW
function wants the full, unexpurgated
command line as returned by the GetCommandLineW
function,
and it breaks it up on the assumption that
the first word on the command line is the program name.
If you hand it an empty string,
the CommandLineToArgvW
function says,
“Whoa,
whoever generated this command line totally screwed up.
I’ll try to muddle through as best I can.”
Next time, we’ll look at the strange status of quotation marks
and backslashes
in CommandLineToArgvW
.
0 comments