CreateProcess执行Windows命令

时间:2012-12-10 13:03:03

标签: windows winapi cmd createprocess

我正在尝试使用CreateProcess函数执行dos命令:

 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)
        { ...

它给出了最后一个错误3 = ERROR_PATH_NOT_FOUND,当我将应用程序路径"C:\\windows\\system32\\cmd.exe"与它显示控制台的命令分开而不执行我的subst命令时。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

您需要在cmd.exe的选项中包含/ C或/ K.

/C      Carries out the command specified by string and then terminates
/K      Carries out the command specified by string but remains

如果没有这些选项,您传递的subst命令将被忽略。

话虽如此,subst,至少在我的Windows 7框中,并未在cmd.exe内实现。它是一个单独的可执行文件因此,您可以直接调用它并完全绕过cmd.exe

关于您对CreateProcess的来电,我有以下评论:

  1. 不要包含路径C:\\windows\\system32。只需调用subst.exe,让系统使用标准搜索路径找到可执行文件。
  2. FALSE传递bInheritHandles。您没有将任何句柄传递给新进程,因此您不需要新进程来继承句柄。
  3. NULL作为工作目录。这里没有必要指定它。

答案 1 :(得分:1)

尝试使用

"C:\\windows\\system32\\cmd.exe /c subst " + DLetter+"  \""+mountPath+"\""

代替。 CMD不会在没有/c/k的情况下接受参数,除非您想在控制台窗口中看到输出,否则只需使用/c