Interceptar el final de un programa cónsola

3323 vistas

En una aplicación cónsola, el código de la sección Finalization se ejecuta si la aplicación se termina de forma normal. No obstante, si el usuario cierra la cónsola pulsando en la cruz de cerrar de la ventana (por ejemplo), el código de la sección Finalization no se ejecutará nunca.

El uso del API SetConsoleCtrlHandler remedia el problema. En este caso pondremos el código de finalización en la función en cuestión.



delphi
  1. program console;
  2.  
  3. {$APPTYPE CONSOLE}
  4. uses Windows, SysUtils;
  5.  
  6. function ConProc(CtrlType : DWord) : Bool; stdcall; far;
  7. var
  8. S : String;
  9. begin
  10. case CtrlType of
  11. CTRL_C_EVENT : S := 'CTRL_C_EVENT';
  12. CTRL_BREAK_EVENT : S := 'CTRL_BREAK_EVENT';
  13. CTRL_CLOSE_EVENT : S := 'CTRL_CLOSE_EVENT';
  14. CTRL_LOGOFF_EVENT : S := 'CTRL_LOGOFF_EVENT';
  15. CTRL_SHUTDOWN_EVENT : S := 'CTRL_SHUTDOWN_EVENT';
  16. else
  17. S := 'UNKNOWN_EVENT';
  18. end;
  19. // Código de finalización
  20. MessageBox(0, PChar(S + ' detectado'), 'Win32 Console', MB_OK);
  21.  
  22. Result := True;
  23. end;
  24.  
  25. begin
  26. SetConsoleCtrlHandler(@ConProc, True);
  27. Writeln('enter para terminar');
  28. Readln;
  29. // desactivar el handle
  30. // SetConsoleCtrlHandler(@ConProc, False);
  31. end.



Nota: dentro del IDE, la finalización de este programa puede causar un fin anómalo del IDE.