Re: Strange CreateProcess() API failure.
"RD" wrote:
I'm seeing strange behavior with CreateProcess() API with
VC++ 2005.
All you need to do is to read the documentation for
`CreateProcess' in MSDN.
bCP = CreateProcess(NULL, TEXT("cmd.exe /C dir") ...);
Failes with Exception with VC++ 8.0. Works fine with VC++
6.0.
<quote>
lpCommandLine
[in, out] The command line to be executed. The maximum
length of this string is 32K characters. If
lpApplicationName is NULL, the module name portion of
lpCommandLine is limited to MAX_PATH characters.
The Unicode version of this function, CreateProcessW, can
modify the contents of this string. Therefore, this
parameter cannot be a pointer to read-only memory (such as a
const variable or a literal string). If this parameter is a
constant string, the function may cause an access violation.
</quote>
Also, the above code compiles due to backward compatibility
with old code. A compiler silently converts literal string
(which is `const char*') to `char*'. However, you're running
with scissors here. Therefore you have been hurt.
bCP = CreateProcess(TEXT(""), TEXT("cmd.exe /C dir") ...);
bCP = CreateProcess(TEXT(""),
TEXT("C:/WINDOWS/system32/cmd.exe /C dir") ...);
Fails with VC++ 8.0; Error code 3 from GetLastError().
The same error with literal strings as above. In addition:
<quote>
If both `lpApplicationName' and `lpCommandLine' are
non-NULL, the null-terminated string pointed to by
`lpApplicationName' specifies the module to execute, and the
null-terminated string pointed to by `lpCommandLine'
specifies the command line.
</quote>
In your code `lpApplicationName' points to empty string,
hence error 3 (ERROR_PATH_NOT_FOUND)
CreateProcess(TEXT("C:/WINDOWS/system32/cmd.exe"),
TEXT("/C dir"),
Works fine. No Error.
It works by chance since second parameter must be read/write
buffer.
Wondering if something wrong with setup/config. on my
system.
Always carefully read a documentation for API functions.
HTH
Alex