0

複数回使用している場合、と変数CreateProcess()を共有しても大丈夫ですか?それとも本当に悪い習慣ですか?かなりの量のドキュメントを読みましたが、呼び出しの処理に関する例を2回以上見つけることができません。PROCESS_INFORMATIONSTARTUPINFOCreateProcess()

例として、私が以下の偽の関数を持っているとしましょう:

    int SampleClass::sampleFn1(){ 
        //Variables
        STARTUPINFOW siStartInfo; 
        PROCESS_INFORMATION piProcInfo; 
        memset(&siStartInfo, 0, sizeof(siStartInfo)); 
        memset(&piProcInfo, 0, sizeof(piProcInfo)); 
        siStartInfo.cb = sizeof(siStartInfo); 

        //let us assume cmdPath = cmd.exe directory, and cmdTxtPtr has correct text
        if(!CreateProcess(cmdPath, cmdTxtPtr, NULL, NULL, false, 0, 
        NULL, NULL, &siStartInfo, &piProcInfo)){
            return 1; //failed at step 1
        }
        if(!CreateProcess(cmdPath,_T("/C ant debug"),NULL,NULL,false,0,NULL,
        (LPCTSTR)directory,&siStartInfo,&piProcInfo)){
            return 2; //failed at debug
        }
        WaitForSingleObject(piProcInfo.hProcess,10000);
        result = GetExitCodeProcess(piProcInfo.hProcess,&exitCode);
        CloseHandle(piProcInfo.hProcess);
        CloseHandle(piProcInfo.hThread);
        return 0;//finished
    }

私のプログラムでも同様の機能が動作しますが、できるだけ安全にしたいと思います。

または...代わりに以下のコードのようなことをする必要があります:

    int SampleClass::sampleFn2(){   
        //Variables
        STARTUPINFOW siStartInfo; 
        PROCESS_INFORMATION piProcInfo; 
        memset(&siStartInfo, 0, sizeof(siStartInfo)); 
        memset(&piProcInfo, 0, sizeof(piProcInfo)); 
        siStartInfo.cb = sizeof(siStartInfo); 

        //let us assume cmdPath = cmd.exe directory, and cmdTxtPtr has correct text
        if(!CreateProcess(cmdPath, cmdTxtPtr, NULL, NULL, false, 
        0, NULL, NULL, &siStartInfo, &piProcInfo)){
            return 1; //failed at update project
        }
        WaitForSingleObject(piProcInfo.hProcess,10000);
        result = GetExitCodeProcess(piProcInfo.hProcess,&exitCode);
        CloseHandle(piProcInfo.hProcess);
        CloseHandle(piProcInfo.hThread);

        memset(&siStartInfo, 0, sizeof(siStartInfo)); 
        memset(&piProcInfo, 0, sizeof(piProcInfo)); 
        siStartInfo.cb = sizeof(siStartInfo); 
        if(!CreateProcess(cmdPath,_T("/C ant debug"),NULL,NULL,
        false,0,NULL,(LPCTSTR)directory,&siStartInfo,&piProcInfo)){
            return 2; //failed at debug
        }
        WaitForSingleObject(piProcInfo.hProcess,10000);
        result = GetExitCodeProcess(piProcInfo.hProcess,&exitCode);
        CloseHandle(piProcInfo.hProcess);
        CloseHandle(piProcInfo.hThread);
        return 0;//finished
    }

それとも、両方ともうまく処理されていませんか?ありがとうございました。

4

1 に答える 1

1

AFAIKCreateProcess関数は、STARTUPINFO構造とPROCESSINFO構造の両方に書き込むため、その情報を気にしない限り、2番目の例を実行できます。

0でmemsetを実行すると、構造体のすべてのデータが0にリセットされます。

これが非常に良い習慣かどうかはわかりませんが、他の誰かがより多くの洞察を与えることができるかもしれません。

于 2012-06-19T21:33:50.813 に答える