0

次のコマンドで子プロセスを作成しようとしています。

    STARTUPINFO si;
    PROCESS_INFORMATION pi;    
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );


  CreateProcess( NULL,   // No module name (use command line)
        NULL,           // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi ); 

ここでクラッシュしますが、その理由はわかりません。

  1. 元のプロセスはコマンド ライン パラメータを受け取るようになりましたが、ここでもそれらを渡す必要がありますか? もしそうなら、私は int main() から子プロセスを作成していないので、次のことを行うことができます:

    LPTSTR szCmdline = TEXT("nmctest -s TS -r DMR -tlLDMR");

次に、CreateProcess() 内で szCmdline を渡しますか?

これがクラッシュする理由を教えてください。

4

1 に答える 1

3

NULLとの両方lpApplicationNameを渡しているため、コードは失敗していますlpCommandLine。少なくとも 1 つの値を渡す必要があります。ドキュメントはそれを明確にしています。

にも値を渡そうとしたようですlpCommandLine。しかし、変更不可能な文字列リテラルを渡しました。繰り返しますが、ドキュメントは許可されていないことを明確にしています。変更可能なメモリへのポインターを渡します。

この関数の Unicode バージョンである CreateProcessW は、この文字列の内容を変更できます。したがって、このパラメーターを読み取り専用メモリー (const 変数やリテラル文字列など) へのポインターにすることはできません。このパラメータが定数文字列の場合、関数によってアクセス違反が発生する可能性があります。

次のようにして、その要件を満たすことができます。

TCHAR szCmdline[] = _T("nmctest -s TS -r DMR -tlLDMR");

個人的にはTCHAR、この時代には必要ないと思います。まだ Windows 98 用のプログラムを書いていないのでしょうか? 私は次のようにします:

wchar_t szCmdline[] = L"nmctest -s TS -r DMR -tlLDMR";

コードで考えられるもう 1 つの失敗ベクトルは、STARTUPINFOパラメーターです。正しく初期化されていることを確認してください。これを行う最も簡単な方法は次のとおりです。

STARTUPINFO si = {0};
si.cb = sizeof(si);

しかし、 への呼び出しを追加したい場合がありますGetStartupInfo

STARTUPINFO si = {0};
si.cb = sizeof(si);
GetStartupInfo(&si);
于 2012-12-12T09:49:13.267 に答える