3

我正在尝试使用 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 命令。

任何帮助将不胜感激。

4

2 回答 2

5

您需要在cmd.exe.

/C 执行字符串指定的命令,然后终止
/K 执行字符串指定的命令,但保持不变

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

话虽如此,subst至少在我的 Windows 7 机器上,并没有在cmd.exe. 它是一个单独的可执行文件。所以你可以直接调用它并cmd.exe完全绕过它。

关于您的来电,CreateProcess我有以下意见:

  1. 不要包括路径C:\\windows\\system32。只需调用subst.exe并让系统使用标准搜索路径定位可执行文件。
  2. FALSEbInheritHandles. 您没有将任何句柄传递给新进程,因此您不需要新进程来继承您的句柄。
  3. NULL作为工作目录传递。只是没有必要在这里指定它。
于 2012-12-10T13:06:59.540 回答
1

尝试使用

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

反而。CMD 不会接受没有/cor的参数/k,除非您想在控制台窗口中查看输出,否则只需使用/c.

于 2012-12-10T13:08:53.757 回答