Ejecutar con ShellExecute, redirigiendo la salida estandard

21/05/2004 - 14:38 por jose | Informe spam
Hola grupo,

Tengo un problema. Deseo ejecutar una aplicación ms-dos y grabar en un
fichero la salida que se genera en pantalla. Por ejemplo:
ping.exe "www.google.com" > salida.txt
He probado con ShellExecute y con _spwanl sin conseguirlo:
HINSTANCE hIns = ShellExecute( GetSafeHwnd(), "open", "C:\\WINNT
\\system32\\ping.exe", " www.google.com > c:\\salida.txt", "C:\\WINNT
\\system32", SW_SHOW );
_spawnl( _P_WAIT, "C:\\WINNT\\system32\\ping.exe", "C:\\WINNT
\\system32\\ping.exe", " www.google.com > c:\\salida.txt", NULL );

¿Se os ocurre qué hago mal?
¿De qué otra forma se puede hacer?

Muchas gracias,

Jose

Preguntas similare

Leer las respuestas

#1 Hernán
21/05/2004 - 18:52 | Informe spam
jose escribía:

Hola grupo,

Tengo un problema. Deseo ejecutar una aplicación ms-dos y grabar en un
fichero la salida que se genera en pantalla. Por ejemplo:
ping.exe "www.google.com" > salida.txt
He probado con ShellExecute y con _spwanl sin conseguirlo:
HINSTANCE hIns = ShellExecute( GetSafeHwnd(), "open", "C:\\WINNT
\\system32\\ping.exe", " www.google.com > c:\\salida.txt", "C:\\WINNT
\\system32", SW_SHOW );
_spawnl( _P_WAIT, "C:\\WINNT\\system32\\ping.exe", "C:\\WINNT
\\system32\\ping.exe", " www.google.com > c:\\salida.txt", NULL );

¿Se os ocurre qué hago mal?
¿De qué otra forma se puede hacer?

Muchas gracias,

Jose



Algo así

STARTUPINFO si = {0};

/* ocultas la consola creada por ping */
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

HANDLE EscribeOutput = CreateFile("c:\\salida.txt", GENERIC_WRITE, \
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (NULL == EscribeOutput)
{
/* fallo CreateFile() */
}
else
{
PROCESS_INFORMATION pi;

si.hStdOutput = EscribeOutput;

if (CreateProcess("C:\\WINNT\\system32\\ping.exe", \
" www.google.com", NULL, NULL, TRUE, \
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);

if (WAIT_FAILED == WaitForSingleObject(pi.hProcess, INFINITE))
{
/* fallo WaitForSingleObject() */
}
CloseHandle(pi.hProcess);
}
CloseHandle(EscribeOutput);
}

Hernán (28)
Quilmes (ar)
Respuesta Responder a este mensaje
#2 Isidro Muñoz
22/05/2004 - 22:29 | Informe spam
Hola,

me imagino que quedras decir ejecutar una aplicación de consola, ping.exe no
es una aplicación MS-DOS.
Puedes usar una forma muy simple que es:

system("ping www.google.com > salida.txt");

Lo que ocurre que te aparecerá una pantalla negra pegando un destello (igual
que cuando ejecutas cmd.exe).

Saludos.
Isidro.
"jose" escribió en el mensaje
news:
Hola grupo,

Tengo un problema. Deseo ejecutar una aplicación ms-dos y grabar en un
fichero la salida que se genera en pantalla. Por ejemplo:
ping.exe "www.google.com" > salida.txt
He probado con ShellExecute y con _spwanl sin conseguirlo:
HINSTANCE hIns = ShellExecute( GetSafeHwnd(), "open", "C:\\WINNT
\\system32\\ping.exe", " www.google.com > c:\\salida.txt", "C:\\WINNT
\\system32", SW_SHOW );
_spawnl( _P_WAIT, "C:\\WINNT\\system32\\ping.exe", "C:\\WINNT
\\system32\\ping.exe", " www.google.com > c:\\salida.txt", NULL );

¿Se os ocurre qué hago mal?
¿De qué otra forma se puede hacer?

Muchas gracias,

Jose
Respuesta Responder a este mensaje
#3 jose
26/05/2004 - 18:04 | Informe spam
Hola Hernán,

He conseguido que funcione siguiendo tu solución.

Una pequeña puntualización al código. Al crear el fichero donde se
escribirá la salida standard se debe hacer utilizando
SECURITY_ATTRIBUTES.

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = 0;
sa.bInheritHandle = TRUE; // <- Sino no se escribe en el fichero

HANDLE hOutFile = CreateFile("c:\\salida_Out.txt", GENERIC_WRITE,
0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


Y una pregunta:
CloseHandle(pi.hThread); // <-- (1)
if (WAIT_FAILED == WaitForSingleObject(pi.hProcess, INFINITE)) //
<-- (2)
{
/* fallo WaitForSingleObject() */
}
CloseHandle(pi.hProcess); // <-- (3)

¿está bien el orden 1, 2 y 3? En otros ejemplos he visto que el orden era
2, 3 y 1


Muchas gracias por todo y saludos,

Jose


Algo así

STARTUPINFO si = {0};

/* ocultas la consola creada por ping */
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

HANDLE EscribeOutput = CreateFile("c:\\salida.txt", GENERIC_WRITE, \
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (NULL == EscribeOutput)
{
/* fallo CreateFile() */
}
else
{
PROCESS_INFORMATION pi;

si.hStdOutput = EscribeOutput;

if (CreateProcess("C:\\WINNT\\system32\\ping.exe", \
" www.google.com", NULL, NULL, TRUE, \
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);

if (WAIT_FAILED == WaitForSingleObject(pi.hProcess,


INFINITE))
{
/* fallo WaitForSingleObject() */
}
CloseHandle(pi.hProcess);
}
CloseHandle(EscribeOutput);
}

Respuesta Responder a este mensaje
#4 jose
26/05/2004 - 18:09 | Informe spam
Hola Isidro,

Tienes razón. Quería decir una aplicación de consola.
En la aplicación no puedo permitir que aparezca el pantallazo (queda poco
profesional y además se tiene que ejecutar muchas veces), por lo que he
optado por la solución que ha propuesto Hernán.

Saludos y muchas gracias,

Jose

"Isidro Muñoz" <imunoz@()daipro.net> wrote in
news:OWrS$:

Hola,

me imagino que quedras decir ejecutar una aplicación de consola,
ping.exe no es una aplicación MS-DOS.
Puedes usar una forma muy simple que es:

system("ping www.google.com > salida.txt");

Lo que ocurre que te aparecerá una pantalla negra pegando un destello
(igual que cuando ejecutas cmd.exe).

Saludos.
Isidro.
Respuesta Responder a este mensaje
#5 Hernán
26/05/2004 - 19:45 | Informe spam
jose escribía:

Hola Hernán,

He conseguido que funcione siguiendo tu solución.

Una pequeña puntualización al código. Al crear el fichero donde se
escribirá la salida standard se debe hacer utilizando
SECURITY_ATTRIBUTES.

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = 0;
sa.bInheritHandle = TRUE; // <- Sino no se escribe en el fichero

HANDLE hOutFile = CreateFile("c:\\salida_Out.txt", GENERIC_WRITE,
0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);





Ooooops! Win98SE... :(

Y una pregunta:
CloseHandle(pi.hThread); // <-- (1)
if (WAIT_FAILED == WaitForSingleObject(pi.hProcess, INFINITE)) //
<-- (2)
{
/* fallo WaitForSingleObject() */
}
CloseHandle(pi.hProcess); // <-- (3)

¿está bien el orden 1, 2 y 3? En otros ejemplos he visto que el orden era
2, 3 y 1





Vos lo cerrás cuando ya no lo vas a usar. Al handle del objeto que
recopila información sobre el thread no se lo usa jamás, así que por qué
no eliminarlo al principio.

Muchas gracias por todo y saludos,

Jose





Hernán (28)
Quilmes (ar)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida