CreateProcess to execute Windows command

不打扰是莪最后的温柔 提交于 2019-12-07 23:29:06

问题


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:

  1. Don't include the path C:\\windows\\system32. Just invoke subst.exe and let the system locate the executable using the standard search path.
  2. Pass FALSE for bInheritHandles. You aren't passing any handles to the new process and so you don't need the new process to inherit your handles.
  3. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!