Ver Mensaje Individual
  #2  
Antiguo 04-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 22
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