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

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Vie 16 Ene, 2009 9:39 am Asunto: QueryEndSession |
|
|
usanso bcb6 y windows xp sp2
El problema es que cuando se cierra o reinicia windows la aplicacion no se cierra , entonces he probado con varias cosas , una fue en el closequery
application->Terminate() , se cierra la aplicacion pero tengo que volver a
decirle a windows que reincie o se apaque ,
y luego he estado probando con QUeryEndSession y EndSession , con uno y los dos a la vez , la aplicacion se cierra pero tengo que volver a darle otra vez a windows que se apague , entonces lo he solucionado en plan cutrillo
abro un dialogo y le digo que debe cerrar la aplicacion antes de cerrar windows , entocen cierra la aplicacion y luego hay que volver a darle cerrar ,y asi queda un poco mas transparente para el usuario ,
ahora viene la pregunta--->hay alguna forma de poder capturar el tipo de message(creo que con end session no se puede, pero a saber)
me refiero a si windows quiere apagarse , reiniciarse o hibernar por ejemplo
y asi poder lanzar una aplicacion para hacerlo despues de cerrar la otra
espero haberme explicado
gracias anticipadas |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 19 Ene, 2009 12:51 am Asunto: |
|
|
Podrías mostrar como estas usando WM_QUERYENDSESSION y WM_ENDSESSION ? Ya que son los mensajes correctos para detectar que se está cerrando la sesión.
https://cppbuilder.es/viewtopic.php?t=8574 |
|
| Volver arriba |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Lun 19 Ene, 2009 12:25 pm Asunto: |
|
|
// al final lo he dejado todo en el query end session
Este es el ultimo que estoy usando , ya que si le doy a Msg.Result = true;
la aplicacion se cierra pero no se cierra windows , ,y tengo que volver a darle cerrar
if(!copiando){
Msg.Result = false; // si cambio a true se cierra la aplicacion pero no windows
ShowMessage("La aplicación debe cerrarse antes de Apagar el equipo \n"
" Ahora puede volver a apagar el sistema.");
Application->Terminate();
}
else if(copiando){
Msg.Result = false;/7 lo mismo que antes
ShowMessage("Se esta llevando a cabo una copia de seguridad.");
Application->Restore();
}
en estos momentos no hay codigo en el end session (todo esta en el query session)
el problema es que no puedo capturar que tipo de logoff se esta sucediendo segun esto por lo menos , por lo que veo el lparam es que dice si la aplicacion se apaga o reinicia , pero no captura si apagado o reinicio,
cogi un codigo en los foros que apaga el sistema , reincia etc , si la ejecuto con la aplicacion corriendo , termina la aplicacion y el sistema se reinia o se apaga correctamente (se ve que fuerza el apagado) , pero no me sirve ya que no puedo capturar cual es el evento exactamente
lParam
If this parameter is zero, the system is shutting down or restarting (it is not possible to determine which event is occurring).
de entrada antes del codigo que he puesto arriba usaba algo sencillo como esto ,lo proben tanto en endsession como en quey session
Msg.Result = true;
Close();
o tambien
Msg.Result = true;
Application->Terminate();
o simplemente
Msg.Result = true;
pero en ningun caso se reiniciaba el sistema , aunque la aplicacion se cerrara,
tengo que decir que estoy usandola en un trayicon
cuando el trayicon minimiza hay una variable que se llama trayicon de tipo bool que si es false dejo cerrar y si es true no , la utilizo en el closeQuery , pero aun eliminando todo el codigo del closequery tampoco funciona el reinicio de windows correctamente( con lo cual opte por poner el codigo de arriba , asi por lo menos saben que es lo que esta pasando y puede reiniciar el sistema aunque tengan que darle otra vez), no me gusta mucho la solucion , pero bueno , aunque en teoria la aplicacion correra en una maquina se usa como servidor y estara en marcha practicamente las 24 horas |
|
| Volver arriba |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Lun 19 Ene, 2009 2:28 pm Asunto: |
|
|
esto se esta poniendo peor por momentos
ahora cada vez que cierro la aplicacion , a partir de la segunda vez
me sale un abnormal application terminate
tanto si cierro la aplicacion normalmente como si reinicio el sistema
pfffff , imagino que debe quedar algo en memoria.............
no se pk pero me veo empezando de 0 |
|
| Volver arriba |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Lun 19 Ene, 2009 3:10 pm Asunto: |
|
|
bueno pfff
ahora ya no me da el abnormal termination
creo que demasiadas variables
voy a mirar de optimizar esto un poco a ver si asi es posible reinciar el sistema correctamente con la aplicacion en marcha. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 19 Ene, 2009 3:15 pm Asunto: |
|
|
| Podrías probar el código del enlace que he puesto más arriba en una aplicación nueva vacía ? porque no creo que el problema este en eso. También asegúrate de que tu programa no esté dentro de algún bucle en el momento que se llama a estos mensajes. |
|
| Volver arriba |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Lun 19 Ene, 2009 5:41 pm Asunto: |
|
|
Si , funciona perfecto en una aplicacion vacia , incluso puse un trayicon para probar a ver y va todo perfecto , se reinicia a la primera sin problemas
ahora me queda ver porque pasa lo que pasa en la otra aplicacion
mirare de optimizar todo a ver que pasa.
Si encuentro el error lo pondre por supuesto
muchas gracias , aqui haceis todos un trabajo que no tiene precio |
|
| Volver arriba |
|
 |
mns Lt

Registrado: 15 Oct 2008Mensajes: 95
|
Publicado: Mar 17 Feb, 2009 12:17 pm Asunto: |
|
|
bueno , al final tengo que decir que no encontre el fallo ni de coña , me harte de buscar y al final , ya hasta arriba y con dolor de cabeza
me puse a rehacerlo todo de nuevo , como tenia hecho casi todo el codigo
solo tuve que implementarlo en la otra aplicacion , de paso fui optimizando todo lo que pude y ahora funciona todo bien , o eso parece por lo menos
ahora ya me puedo poner con el cliente a ver que pasa....... |
|
| Volver arriba |
|
 |
Isa1976 Lt Cmdr


Registrado: 23 Nov 2005Mensajes: 104
|
Publicado: Mar 18 May, 2010 11:38 am Asunto: |
|
|
hola,
a mi me pasaba lo mismo y llevo ya dos dias buscando por internet, un lio, la única forma de que funcione con seguridad (y la verdad es que no sabría explicar muy bién por que), es utilizando exit(1), ya que según cuentan, el exit(0) detiene el cierre de windows (al menos en XP), y puede ser que tanto application->Terminate() como Close(), utilicen ese exit(0) por algún lado. Es lo único que puedo decir. Seguro que alguien puede explicarlo mejor.
Este es el codigo con el cual me funciona perfecto:
(basándome en un mensaje de _Leo)
| Código: |
//en el .h
void __fastcall WMQueryEndSession(TWMQueryEndSession& msg);
void __fastcall WMEndSession(TWMEndSession& msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_QUERYENDSESSION, TWMQueryEndSession, WMQueryEndSession)
MESSAGE_HANDLER(WM_ENDSESSION, TWMEndSession, WMEndSession)
END_MESSAGE_MAP(TForm)
//en el .cpp
void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession& msg)
{
forceclose=true; //bool para el OnCloseQuery y salte a canclose=true
msg.Result= TRUE;
exit(1);
}
void __fastcall TForm1::WMEndSession(TWMEndSession& msg)
{
// Aquí ponemos lo que queramos que se ejecute antes de cerrar la sesión
msg.Result= TRUE;
exit(1);
}
|
Un saludo! |
|
| 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.
|