Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ejecutar un programa y redireccionar la salida (StdOut)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ejecutar un programa y redireccionar la salida (StdOut) Responder citando

Esta función toma como parámetro el path del archivo a ejecutar y devuelve un string con los datos del StdOut o StdError en su defecto.
NOTAS:
- Esta función utiliza la Api de Windows.
- Solo funciona con aplicaciones de 32 bits.
- Beta. No a sido implementada la gestión de posibles errores además de que no an sido solucionados algunos bugs.


Código:

String ExecCmdPipe(String CmdLine)
{
 HANDLE ReadPipe,WritePipe;
 char Buffer[256*4];
 unsigned long BReaded;
 String Aux;

 SECURITY_ATTRIBUTES SA;
 SA.bInheritHandle = true;
 SA.lpSecurityDescriptor = NULL;
 SA.nLength = sizeof(SA);

 Win32Check(CreatePipe(&ReadPipe,&WritePipe,&SA,0));

 STARTUPINFO Start;
 //GetStartupInfo(&Start);
 Start.cb = sizeof(Start);
 Start.lpReserved = NULL;
 Start.lpDesktop = NULL;
 Start.cbReserved2 = 0;
 Start.lpReserved2 = NULL;
 Start.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 Start.wShowWindow = SW_HIDE;
 Start.hStdOutput = WritePipe;
 Start.hStdError = WritePipe;

 PROCESS_INFORMATION PInfo;

 Win32Check(CreateProcess(NULL,CmdLine.c_str(),&SA,&SA,true,0,NULL,NULL,&Start,&PInfo));
 CloseHandle(WritePipe);
 Win32Check(ReadFile(ReadPipe,&Buffer,((255*4)-1),&BReaded,NULL));
 WaitForSingleObject(PInfo.hProcess,INFINITE);
 CloseHandle(ReadPipe);
 return (String)Buffer;


}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Esta es más estable y comentada Wink
Código:

bool ExecCmdPipe(String CmdLine,String & StdOut_,bool ShowErrors)
{
 //Variables
 HANDLE ReadPipe,WritePipe; //Creamos los pipes de los HANDLES
 char Buffer[8*1024]; //Creamos el bufer (MAX:8KB)
 unsigned long BReaded; //Indica la cantidad de bytes leidos
 int Res; //Indica si ha ocurrido algun error al ejecutar un funcion de la API

 //Estructura con los atributos de seguridad para Windows
 SECURITY_ATTRIBUTES SA;
 SA.bInheritHandle = true;//Indicamos que los Handles se heredan
 SA.lpSecurityDescriptor = NULL;
 SA.nLength = sizeof(SA);

 //Creamos el Pipe entre los handles
 Res = CreatePipe(&ReadPipe,&WritePipe,&SA,0);
  if(!Res)//Gestion de Errores
   {
    if(ShowErrors) Win32Check(Res);
    return false;
   }

 //Estructura de Inicio de un proceso
 STARTUPINFO Start;
 //GetStartupInfo(&Start);
 Start.cb = sizeof(Start);
 Start.lpReserved = NULL;
 Start.lpDesktop = NULL;
 Start.cbReserved2 = 0;
 Start.lpReserved2 = NULL;
 Start.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 Start.wShowWindow = SW_HIDE;
 Start.hStdOutput = WritePipe;
 Start.hStdError = WritePipe;
 //Estructura de ID de un proceso
 PROCESS_INFORMATION PInfo;

 //Creamos el proceso
 Res = CreateProcess(NULL,CmdLine.c_str(),&SA,&SA,true,0,NULL,NULL,&Start,&PInfo);
  if(!Res)//Gestion de Errores
   {
    if(ShowErrors) Win32Check(Res);
    return false;
   }

 //Cerramos el Handle de escritura para evitar la posible manipulacion accidental de este
 CloseHandle(WritePipe);

 //leemos el pipe enlazado al StdOut del proceso
 Res = ReadFile(ReadPipe,&Buffer,(sizeof(Buffer)-1),&BReaded,NULL);
  if(!Res)//Gestion de Errores
   {
    if(ShowErrors) Win32Check(Res);
    return false;
   }
 //Esperamos a que el proceso finalize (en este punto ya deberia haber finalizado)
 WaitForSingleObject(PInfo.hProcess,INFINITE);
 //Cerramos handles y devolvemos los resultados
 CloseHandle(ReadPipe);
 CloseHandle(PInfo.hProcess);
 CloseHandle(PInfo.hThread);
 StdOut_ = Buffer;
 return true;


}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Tengo problemillas con esa funcion Responder citando

Tengo un problemilla con esta funcion, y me gustaria que pudieramos ver porque a veces falla al crear el proceso, no se que es lo que esta pasando.

Un Saludo.

Viator_sg escribió:
Esta es más estable y comentada Wink
Código:

bool ExecCmdPipe(String CmdLine,String & StdOut_,bool ShowErrors)
{
 //Variables
 HANDLE ReadPipe,WritePipe; //Creamos los pipes de los HANDLES
 char Buffer[8*1024]; //Creamos el bufer (MAX:8KB)
 unsigned long BReaded; //Indica la cantidad de bytes leidos
 int Res; //Indica si ha ocurrido algun error al ejecutar un funcion de la API

 //Estructura con los atributos de seguridad para Windows
 SECURITY_ATTRIBUTES SA;
 SA.bInheritHandle = true;//Indicamos que los Handles se heredan
 SA.lpSecurityDescriptor = NULL;
 SA.nLength = sizeof(SA);

 //Creamos el Pipe entre los handles
 Res = CreatePipe(&ReadPipe,&WritePipe,&SA,0);
  if(!Res)//Gestion de Errores
   {
    if(ShowErrors) Win32Check(Res);
    return false;
   }

 //Estructura de Inicio de un proceso
 STARTUPINFO Start;
 //GetStartupInfo(&Start);
 Start.cb = sizeof(Start);
 Start.lpReserved = NULL;
 Start.lpDesktop = NULL;
 Start.cbReserved2 = 0;
 Start.lpReserved2 = NULL;
 Start.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 Start.wShowWindow = SW_HIDE;
 Start.hStdOutput = WritePipe;
 Start.hStdError = WritePipe;
 //Estructura de ID de un proceso
 PROCESS_INFORMATION PInfo;

 //Creamos el proceso
 Res = CreateProcess(NULL,CmdLine.c_str(),&SA,&SA,true,0,NULL,NULL,&Start,&PInfo);
  if(!Res)//Gestion de Errores
   {
    if(ShowErrors) Win32Check(Res);
    return false;
   }

 //Cerramos el Handle de escritura para evitar la posible manipulacion accidental de este
 CloseHandle(WritePipe);

 //leemos el pipe enlazado al StdOut del proceso
 Res = ReadFile(ReadPipe,&Buffer,(sizeof(Buffer)-1),&BReaded,NULL);
  if(!Res)//Gestion de Errores
   {
    if(ShowErrors) Win32Check(Res);
    return false;
   }
 //Esperamos a que el proceso finalize (en este punto ya deberia haber finalizado)
 WaitForSingleObject(PInfo.hProcess,INFINITE);
 //Cerramos handles y devolvemos los resultados
 CloseHandle(ReadPipe);
 CloseHandle(PInfo.hProcess);
 CloseHandle(PInfo.hThread);
 StdOut_ = Buffer;
 return true;


}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.