2010-04-20 12 views
6

Estoy utilizando CreateProcess() para ejecutar una aplicación de consola externa en Windows desde mi aplicación GUI. Me gustaría reunir de alguna manera la salida para saber si hubo errores. Ahora sé que tengo que hacer algo con hStdOutput, pero no entiendo qué. Soy nuevo en C++ y soy un programador inexperto y, de hecho, no sé qué hacer con un mango o cómo encender una tubería.Uso de un identificador para recopilar resultados de CreateProcess()

¿Cómo obtengo la salida a algún tipo de variable (o archivo)?

Esto es lo que tengo un momento:

void email::run(string path,string cmd){ 


    WCHAR * ppath=new(nothrow) WCHAR[path.length()*2]; 
    memset(ppath,' ',path.length()*2); 
    WCHAR * pcmd= new(nothrow) WCHAR[cmd.length()*2]; 
    memset(pcmd,' ',cmd.length()*2); 

    string tempstr; 


    ToWCHAR(path,ppath); //creates WCHAR from my std::string 
    ToWCHAR(cmd,pcmd); 

    STARTUPINFO info={sizeof(info)}; 
    info.dwFlags = STARTF_USESHOWWINDOW; //hide process 

    PROCESS_INFORMATION processInfo; 

    if (CreateProcess(ppath,pcmd, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo)) 
     { 
     ::WaitForSingleObject(processInfo.hProcess, INFINITE); 

     CloseHandle(processInfo.hProcess); 
     CloseHandle(processInfo.hThread); 
     } 

    delete[](ppath); 
    delete[](pcmd); 
} 

Este código probablemente tiene algún grito programador decente, pero (yo ni siquiera debería decirlo :) Funciona ;-)

El Pregunta: ¿Cómo uso hStdOutput para leer el resultado en un archivo (por ejemplo)?

+0

relacionadas: [? Lanzar un exe/proceso con stdin stdout y stderr] (http://stackoverflow.com/questions/5485923/launch-an-exe-process-with-stdin -stdout-and-stderr/39648986). Además, consulte [tiny-process-library] (https://github.com/eidheim/tiny-process-library) que es muy conveniente. – Delgan

Respuesta

-2

BOOL WINAPI GetExitCodeProcess ( __in MANIPULAR hProcess, __out LPDWORD lpExitCode );

Pase processInfo.hProcess para obtener el código de salida del proceso.

+0

Quiere obtener la salida, no el código de salida. – fleed

3

Microsoft tiene un ejemplo en su base de conocimiento que muestra cómo capturar el resultado de un proceso de consola hijo. El principio básico es que el proceso padre crea conductos (uno por asa estándar para redirigir) y pasa los identificadores a CreateProcess.

No es necesario modificar el proceso secundario para que esto funcione, lo cual es importante si no tiene control sobre la fuente del elemento secundario.

Más información: How to spawn console processes with redirected standard handles

Cuestiones relacionadas