0

如果我CreateProcess()多次使用,可以共享PROCESS_INFORMATIONSTARTUPINFO变量吗?或者这真的是不好的做法?我已经阅读了很多文档,但是我找不到任何关于CreateProcess()多次处理调用的示例。

例如,假设我有下面的假功能:

    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

AFAIK 该CreateProcess函数同时写入 STARTUPINFO 和 PROCESSINFO 结构,因此除非您不关心任何这些信息,我认为您应该这样做,否则您可以执行您给出的第二个示例。

通过使用 0 执行 memset,您将结构中的所有数据重置为 0。

我不确定这是非常好的做法,但也许其他人可以提供更多见解。

于 2012-06-19T21:33:50.813 回答