问题
I am trying to execute a dos command using CreateProcess function :
LPWSTR cmd=(LPWSTR)QString("C:\\windows\\system32\\cmd.exe subst " + DLetter+" \""+mountPath+"\"").utf16();
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if ( CreateProcessW(0, // Application name
cmd, // Application arguments
NULL,
NULL,
TRUE,
0,
NULL,
L"C:\\windows\\system32", // Working directory
&si,
&pi) == TRUE)
{ ...
it give as last error 3 = ERROR_PATH_NOT_FOUND, when I separate the application path "C:\\windows\\system32\\cmd.exe"
from the command it shows the console without executing my subst command.
Any help will be appreciated.
回答1:
You need to include either /C or /K in the options to cmd.exe
.
/C Carries out the command specified by string and then terminates /K Carries out the command specified by string but remains
Without one these options, the subst
command that you pass is simply ignored.
Having said that, subst
, at least on my Windows 7 box, is not implemented inside cmd.exe
. It is a separate executable. So you can invoke it directly and bypass cmd.exe
completely.
Regarding your call to CreateProcess
I have the following comments:
- Don't include the path
C:\\windows\\system32
. Just invokesubst.exe
and let the system locate the executable using the standard search path. - Pass
FALSE
forbInheritHandles
. You aren't passing any handles to the new process and so you don't need the new process to inherit your handles. - Pass
NULL
as the working directory. There's just no need to specify it here.
回答2:
Try using
"C:\\windows\\system32\\cmd.exe /c subst " + DLetter+" \""+mountPath+"\""
instead. CMD won't accept arguments without either /c
or /k
, and unless you want to see the output in the console window, just use /c
.
来源:https://stackoverflow.com/questions/13801517/createprocess-to-execute-windows-command