elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
28 Agosto 2008, 18:01  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderador: ®®)
| | |-+  [SOLUCIONADO] Cerrar aplicación C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: [SOLUCIONADO] Cerrar aplicación C++  (Leído 444 veces)
asesino88

Desconectado Desconectado

Mensajes: 26


Ver Perfil
[SOLUCIONADO] Cerrar aplicación C++
« en: 23 Junio 2008, 12:05 »

Hola a todos.

Mi duda es la siguiente: ¿Cómo puedo cerrar una aplicación en C++? o sea, me refiero a que por ejemplo utilizando la función
Código:
ShellExecute(NULL, "open", URL, NULL, NULL, SW_SHOWNORMAL);
que abre el navegador de internet con una url, ¿cómo hago para cerrar el navegador? ¿es cambiando "open" por "close" en la función o hay otra manera mucho mejor? Gracias.

Saludos
« Última modificación: 26 Junio 2008, 13:25 por asesino88 » En línea
®®
Moderador
*****
Desconectado Desconectado

Mensajes: 5.128


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #1 en: 23 Junio 2008, 12:48 »

terminateprocess
En línea
HySTD

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #2 en: 23 Junio 2008, 13:31 »

También puedes usar CloseHandle. De algún modo u otro necesitas conocer el Handle del proceso que quieres manipular (cerrar).

Un saludo.
En línea
asesino88

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #3 en: 23 Junio 2008, 15:33 »

Hola

- Para ®®
He mirado esta función
Código:
BOOL WINAPI TerminateProcess(
  __in  HANDLE hProcess,
  __in  UINT uExitCode
);
pero no sé como usarla. ¿ Puedes mostrar algún código de como cerrar, por ejemplo, mozilla firefox ?

- Para HySTD
¿ Cómo puedo averiguar cuál es el Handle de un programa para poder hacer CloseHandle ?

Gracias a ambos.
Saludos
En línea
®®
Moderador
*****
Desconectado Desconectado

Mensajes: 5.128


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #4 en: 23 Junio 2008, 16:00 »

Citar
HANDLE p;
 
 p=OpenProcess(PROCESS_ALL_ACCESS,0,GetCurrentProcessId());
 TerminateProcess(p,0);

cierra tu propio proceso.

PD: closehandle que yo sepa no termina el proceso.
En línea
rog

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #5 en: 23 Junio 2008, 16:34 »

yo uso el struct ShellExecuteInfo

Código:
SHELLEXECUTEINFO bfghijlnos;
memset(&bfghijlnos, 0, sizeof(bfghijlnos));
bfghijlnos.cbSize       = sizeof(bfghijlnos);
bfghijlnos.fMask        = SEE_MASK_NOCLOSEPROCESS;         
//bfghijlnos.fMask        = 0;         
bfghijlnos.hwnd         = 0;               
bfghijlnos.lpVerb       = "open"; 
bfghijlnos.lpFile       = command;
bfghijlnos.lpParameters = parameter;
bfghijlnos.lpDirectory  = NULL;
if(windows_status == 5)
{
bfghijlnos.nShow = SW_HIDE;
}
else
{
bfghijlnos.nShow = SW_SHOW;
}
//
if(!ShellExecuteEx(&bfghijlnos))
{
//display_connection_failed();
return -1;
}
else
{
return 0;
}
}

para cierrar el child process : TerminateProcess(bfghijlnos.hProcess, 0);

rog
En línea
HySTD

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #6 en: 23 Junio 2008, 17:03 »

Citar
PD: closehandle que yo sepa no termina el proceso.

CloseHandle, no termina un proceso externo si se ejecuta en modo usuario (ring3), básicamente porque no puede acceder al espacio de memoria de dicho proceso. No obstante si libera los recursos ocupados por el proceso actual (o local). Es recomendable llamar a closehandle antes de llamar a terminateprocess.

Citar
Citar
HANDLE p;
 
 p=OpenProcess(PROCESS_ALL_ACCESS,0,GetCurrentProcessId());
 TerminateProcess(p,0);

cierra tu propio proceso.

Equivale a ExitProcess(0);

Un saludo
« Última modificación: 23 Junio 2008, 17:06 por HySTD » En línea
®®
Moderador
*****
Desconectado Desconectado

Mensajes: 5.128


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #7 en: 23 Junio 2008, 17:31 »

Citar
CloseHandle, no termina un proceso externo si se ejecuta en modo usuario (ring3), básicamente porque no puede acceder al espacio de memoria de dicho proceso.

pues nunca lo he probado, si es cierto mejor asi no me como la cabea buscando pspterminateprocess.

Citar
Es recomendable llamar a closehandle antes de llamar a terminateprocess.


segun la documentacion no.
En línea
rog

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #8 en: 23 Junio 2008, 17:34 »

jeje

bfghijlnos.fMask        = SEE_MASK_NOCLOSEPROCESS;

yo no creio que closehandle puede cierrar el child process

my codigo

Código:
/*****************************************************************************************************
* check and close hprocess
******************************************************************************************************/
int check_n_close_hprocess(){
//
if(bfghijlnos.hProcess != NULL)
//if(bfghijlnos.hProcess != NULL)
{
if(TerminateProcess(bfghijlnos.hProcess, 0) == 0)
{
print_formatted_string("fermeture de la connection");
printf("impossible de terminer le process");
print_dot(10);
return 1;
}
else if(CloseHandle(bfghijlnos.hProcess) == 0)
{
print_formatted_string("fermeture de la connection");
printf("impossible de fermer la ressource connection");
print_dot(10);
return 1;
}
else
{
bfghijlnos.hProcess = NULL;
print_formatted_string("fermeture de la connection");
printf("connection closed");
print_dot(10);
return 0;
}
}
else
{
print_formatted_string("fermeture de la connection");
printf("connection introuvable");
print_dot(10);
return 0;
}
}



rog
En línea
HySTD

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #9 en: 23 Junio 2008, 17:44 »

rog, no está documentada, porque no es "una norma". A ver, por poner un ejemplo, eso equivale a cuando creas objetos o instancias de una clase cualquiera, no estás obligado a liberarlos cuando ya no los utilices, (dependiendo del lenguaje, llamadas a Free, destroy, etc... de dicho objeto). Pero si es cierto que optimizas el código. Del mismo modo si no liberas esos objetos, cuando cierras la aplicación, todas las instancias de las clases y objetos creados por el proceso son liberados por el sistema operativo.

Remitiendonos a este caso, un hilo, un proceso, o cualquier objeto direccionable por un handle, es recomendable liberarlo manualmente. Si no lo haces tampoco pasa nada, ya que con TerminateProcess los recursos serán liberados por el SO, pero lo correcto es hacerlo así.

Un saludo
En línea
rog

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #10 en: 23 Junio 2008, 20:48 »

bueno compañero

el caso del flag "SEE_MASK_NOCLOSEPROCESS;"

e para non cierrar el child process no caso cierra el parent process

rog
En línea
asesino88

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #11 en: 25 Junio 2008, 16:55 »

Buenas, disculpad la demora, los exámenes me tienen liado ::)
He estado leyendo vuestras respuestas y tengo dudas:

- Para ®®
No sé como utilizar tu código
Código:
HANDLE p;
 
 p=OpenProcess(PROCESS_ALL_ACCESS,0,GetCurrentProcessId());
 TerminateProcess(p,0);
lo que creo entender es que asignas el ejecutable del main al proceso, pero lo que yo necesito no es cerrar mi proceso sino otro proceso como puede ser un navegador de internet o una carpeta. No sé si has entendido cuál es mi idea.

- Para rog
He utilizado tu código pero me cuesta mucho entenderlo y no consigo compilarlo tampoco.

Otra forma que he pensado es que en vez de que mi programa abra una ventana de una carpeta o de firefox, pues que realice lo mismo pero sin verse, o sea, que se meta en la dirección que yo especifique pero que el usuario no lo vea, esto parece que es un virus pero no, sólo quiero visitar páginas y carpetas sin que me las muestre para realizar operaciones con ellas como crear y borrar ficheros.

Gracias a todos por responder con rapidez.
En línea
®®
Moderador
*****
Desconectado Desconectado

Mensajes: 5.128


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #12 en: 25 Junio 2008, 17:21 »

Citar
Para ®®
No sé como utilizar tu código
Código:

HANDLE p;
 
 p=OpenProcess(PROCESS_ALL_ACCESS,0,GetCurrentProcessId());
 TerminateProcess(p,0);

lo que creo entender es que asignas el ejecutable del main al proceso, pero lo que yo necesito no es cerrar mi proceso sino otro proceso como puede ser un navegador de internet o una carpeta. No sé si has entendido cuál es mi idea.

si le dedicases 2 minutos a mirar la documentacion lo entenderias. entiendo que no necesitas cerrar tu proceso, pero eso es un ejemplo y creo que es claro. necesitas saber el pid del proceso a cerrar, ya que el tercer parametro es lo que te pide (GetCurrentProcessId para el ejemplo).
En línea
asesino88

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Cerrar aplicación C++
« Respuesta #13 en: 25 Junio 2008, 17:27 »

Hola,
Según lo que me dices, entonces lo que necesito es modificar en el código que escribiste GetCurrentProcessId() por el proceso que quiero cerrar. Bueno y ¿ cómo encuentro el número pid del proceso que necesito quitar? Gracias de antemano ®®

PD: he buscado por el foro y he encontrado la manera de ver cual es el PID que necesito y de ver como se borra el proceso usando el PID.

Gracias a todos
« Última modificación: 26 Junio 2008, 13:24 por asesino88 » En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  





Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC