Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-06-2007
Avatar de alaintm
alaintm alaintm is offline
Registrado
 
Registrado: jun 2007
Posts: 3
Poder: 0
alaintm Va por buen camino
Error de Aplicación al cerrar Windows

Saludos a todos.
Tengo desarrollada una aplicación la cual ejecuta con un timer un fichero de lote (.bat), el problema en si es que si cierro la aplicación no me da error, pero al cerrar Windows y la aplicación de esta ejecutando me devuelve un error que indica que cmd.exe no se ha ejecutado correctamente y pulse aceptar para cerrarlo, si modifico el intervalo del timer de 1000 a 5000 puede que no aparezca el error o en otros casos si aparece en el caso de que este en 1000 siempre se muestra el error.

agradezco de antemano su ayuda

a continuación agrego el código de la Unit

Código Delphi [-]unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, AppEvnts; type TForm1 = class(TForm) Timer1: TTimer; ApplicationEvents1: TApplicationEvents; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION; public { Public declarations } end; var Form1: TForm1; app, cmd: Integer; implementation {$R *.dfm} procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession); begin try app:= 1; Msg.result := 1; finally halt; end; end; procedure TForm1.FormCreate(Sender: TObject); begin app:=0; cmd:=FindWindow(nil,'C:\WINDOWS\system32\cmd.exe'); end; procedure TForm1.Timer1Timer(Sender: TObject); begin if app = 0 then begin if cmd = 0 then WinExec(PChar('clean.bat'),SW_HIDE); end else begin app:= 1; end; end; procedure TForm1.FormPaint(Sender: TObject); begin Form1.Hide; end; end.
Responder Con Cita
  #2  
Antiguo 04-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Ok

Huuyyy... Para la proxima procura hacer "Vista previa" para que el código no este de esta forma, pues es bastante molesto para quien te ayude hacer algo sin entender el problema...

Código Delphi [-]
unit Unit1;
 
interface
 
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, AppEvnts;
 
type
 TForm1 = class(TForm)
    Timer1: TTimer;
    ApplicationEvents1: TApplicationEvents;
  procedure FormCreate(Sender: TObject); 
  procedure Timer1Timer(Sender: TObject); 
  procedure FormPaint(Sender: TObject); 
 private { Private declarations }
  procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
 public { Public declarations } 
end; 
 
var
 Form1: TForm1; 
 app, cmd: Integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
 try
  app:= 1;
  Msg.result := 1; 
 finally 
  halt;
 end; 
end; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
 app:=0; 
 cmd:=FindWindow(nil,'C:\WINDOWS\system32\cmd.exe'); 
end; 
 
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
 if app = 0 then
  begin 
   if cmd = 0 then 
    WinExec(PChar('clean.bat'),SW_HIDE); 
  end 
 else 
  begin 
   app:= 1; 
  end; 
end; 
 
procedure TForm1.FormPaint(Sender: TObject); 
begin 
 Form1.Hide; 
end; 
 
end.

Tengo algunos comentarios del código, por ejemplo no me queda muy claro para qué utilizas un TApplicationEvents...

La segunda, el mensaje WM_QUERYENDSESSION y por consiguiente el método WMQueryEndSession ya están definidos en el evento OnCloseQuery... no es necesario volverlo a definir!!!

Otra cosilla, cuando haces
Código Delphi [-]
 if app = 0 then
  begin
   if cmd = 0 then
    WinExec(PChar('clean.bat'),SW_HIDE);
  end
 else
  begin
   app:= 1;
  end;

no es necesario el else... no estas copiando todo el código? tampoco veo que sea funcional la variable "cmd"...

Cuando el Güindos va cerrando las aplicaciones (ventanas), y luego los procesos, cada cual ejecuta un grupo propio de procedimientos de "salida", en el cual libera memoria, cierra archivos, termina Timers, etc...

Ahora el que esta produciendo el error más que ser tu aplicacion, es el CMD... cuando cierras sesion, con el fin de cerrar sesion, apagar o reiniciar o al fin lo que sea, todos los procesos excepto algunos como el lsass.exe son finalizados uno por uno (como ya comente)... cuando tu intentas correr algo y ya no "se puede" pues ya no hay "soporte" para ésta, pues habran un buen numero de errores... cuentanos que hace tu batch?

Te pregunto pues estoy casi seguro que hay alguna forma mas sencilla y mejor de solucionar el problema y hacer lo que hace el batch.

Saludos
Responder Con Cita
  #3  
Antiguo 07-06-2007
Avatar de alaintm
alaintm alaintm is offline
Registrado
 
Registrado: jun 2007
Posts: 3
Poder: 0
alaintm Va por buen camino
La idea del programa es que cada un tiempo determinado borre los archivos exe y dll de un directorio y la solución que encontre era la de ejecutar un fichero lote.

Salu2
Responder Con Cita
  #4  
Antiguo 09-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Ok

Cita:
Empezado por alaintm
La idea del programa es que cada un tiempo determinado borre los archivos exe y dll de un directorio y la solución que encontre era la de ejecutar un fichero lote.
Con ese dato se me ocurre que haces una eliminacion por comodín, siendo el caso te dejo el siguiente código, pruebalo y nos comentas:

Código Delphi [-]
uses ShellAPI;
 
var DelOp: TSHFileOpStruct = (wFunc: FO_DELETE; fFlags: FOF_SILENT or FOF_NOCONFIRMATION);
 
function Deltree(const Path: PChar): LongBool;
begin
 DelOp.pFrom := Path;
 Result := ShFileOperation(DelOp) = 0;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Deltree('c:\güindos\system32\*.exe');
 Deltree('c:\güindos\system32\*.dll');
end;

Si me equivoco, y borras archivo por archivo siendo los nombres conocidos y la cantidad contada, pues puedes usar la API: 'DeleteFile' que no acepta comodines.

PD: Disculpa el retraso de la respuesta pero estaba programando.
Suerte!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error al cerrar la aplicación sagarmar Varios 2 22-02-2007 13:30:58
Error al cerrar mi aplicación busraglu Conexión con bases de datos 2 29-01-2007 21:55:09
Error al cerrar mi aplicación Albano OOP 1 08-12-2005 20:42:32
Error al cerrar la aplicación en RTL90.bpl Jesús Pena Varios 0 24-11-2005 11:27:08
Error al cerrar la aplicacion!! Waldo API de Windows 2 22-11-2003 00:39:12


La franja horaria es GMT +2. Ahora son las 20:34:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi