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

のオプションに/Cまたは/Kのいずれかを含める必要がありますcmd.exe

/C文字列で指定されたコマンドを実行して終了します
/ K文字列で指定されたコマンドを実行しますが、残ります

これらのオプションが1つもないと、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+"\""

代わりは。/cCMDは、またはのいずれかがないと引数を受け入れません。/kコンソールウィンドウに出力を表示する場合を除いて、を使用して/cください。

于 2012-12-10T13:08:53.757 に答える