 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Viator_sg Cdt

Registrado: 13 Dic 2003Mensajes: 2
|
Publicado: Sab 13 Dic, 2003 1:03 am Asunto: Ejecutar un programa y redireccionar la salida (StdOut) |
|
|
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 |
|
 |
Viator_sg Cdt

Registrado: 13 Dic 2003Mensajes: 2
|
Publicado: Sab 13 Dic, 2003 1:50 pm Asunto: |
|
|
Esta es más estable y comentada
| 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 |
|
 |
axl79 Cdt

Registrado: 26 Abr 2004Mensajes: 6
|
Publicado: Jue 29 Abr, 2004 7:51 pm Asunto: Tengo problemillas con esa funcion |
|
|
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
| 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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|