отловить CTRL-C

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

отловить CTRL-C

Сообщение aeon » 03.10.2006 02:06:29

как в FPC отловить нажатие CTRL-C в консольной программе?
ибо нужно перед выходом выполнить кое-какие завершающие действия.
надо под Win и под Linux.
никакого эксепшена вроде нету для этого :(
aeon
незнакомец
 
Сообщения: 2
Зарегистрирован: 03.10.2006 02:01:29

Сообщение aeon » 06.10.2006 02:07:52

спасибо за такие содержательные, многочисленные, а главное, полезные ответы, блин..

Код: Выделить всё
unit CtrlC;
{$MODE DELPHI}
{$H+}

interface

uses SysUtils {$IFDEF LINUX}, BaseUnix {$ENDIF};

procedure SetCtrlCHandler;
function IsAborted: boolean;

implementation

var
  Aborted: boolean;

{$IFDEF LINUX}
procedure CtrlHandler(sig: cint); cdecl;
begin
  //writeln('signal= ', sig);
  if sig = SIGINT then
    Aborted := True;
end;

{$ELSE}
function SetConsoleCtrlHandler(HandlerRoutine: pointer; Add: LongBool): LongBool;
  stdcall; external 'kernel32.dll';

function CtrlHandler(CtrlType: DWORD): LongBool; stdcall;
const
  CTRL_C_EVENT = 0;
begin
  Result := False;
  if CtrlType = CTRL_C_EVENT then
  begin
    Aborted := True;
    Result := True;
  end;
end;
{$ENDIF}

procedure SetCtrlCHandler;
{$IFDEF LINUX}
var
  oa, na: SigActionRec;
{$ENDIF}
begin
{$IFDEF LINUX}
  na.sa_handler := SigActionHandler(@CtrlHandler);
  FillChar(na.sa_mask, sizeof(na.sa_mask), #0);
  na.sa_flags := SA_ONESHOT;
  na.sa_restorer := nil;
  fpSigAction(SIGINT, @na, @oa);
{$ELSE}
  SetConsoleCtrlHandler(@CtrlHandler, True);
{$ENDIF}
end;

function IsAborted: boolean;
begin
  Result := Aborted;
end;

end.
aeon
незнакомец
 
Сообщения: 2
Зарегистрирован: 03.10.2006 02:01:29


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Рейтинг@Mail.ru