Páginas: [1]
|
 |
|
Autor
|
Tema: [SOLUCIONADO] Cerrar aplicación C++ (Leído 444 veces)
|
asesino88
Desconectado
Mensajes: 26
|
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 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
|
|
|
|
|
®®
|
terminateprocess
|
|
|
|
|
En línea
|
|
|
|
HySTD
Desconectado
Mensajes: 9
|
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
Mensajes: 26
|
Hola - Para ®® He mirado esta función 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
|
|
|
|
|
®®
|
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
Mensajes: 39
|
yo uso el struct ShellExecuteInfo 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
Mensajes: 9
|
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 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
|
|
|
|
|
®®
|
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. Es recomendable llamar a closehandle antes de llamar a terminateprocess.
segun la documentacion no.
|
|
|
|
|
En línea
|
|
|
|
rog
Desconectado
Mensajes: 39
|
jeje bfghijlnos.fMask = SEE_MASK_NOCLOSEPROCESS; yo no creio que closehandle puede cierrar el child process my codigo /***************************************************************************************************** * 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
Mensajes: 9
|
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
Mensajes: 39
|
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
Mensajes: 26
|
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 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
|
|
|
|
|
®®
|
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
Mensajes: 26
|
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]
|
|
|
|