Регистрация функции управления обработчиком


Это - пример функции SetConsoleCtrlHandler, которая используется для установки управляющего обработчика .

Когда от CTRL+C принимается сигнал , управляющий обработчик возвращает (значение) ИСТИНА (TRUE), указывая, что он обработал сигнал. Это действие не допускает вызовы других управляющих обработчиков.

Когда принимается сигнал CTRL_CLOSE_EVENT, управляющий обработчик возвращает значение ИСТИНА (TRUE), заставляя систему показать на экране диалоговое окно, которое дает пользователю выбор окончания процесса и закрытия консоли или разрешения процесса, чтобы продолжить выполнение. Если пользователь выбирает не завершать работу процесса, система закрывает консоль, когда процесс наконец заканчивает свою работу.

Когда от CTRL+BREAK принимается сигнал CTRL_LOGOFF_EVENT или CTRL_SHUTDOWN_EVENT, управляющий обработчик возвращает значение ЛОЖЬ (FALSE). Это действие заставляет передать сигнал следующей управляющей функции обработчика. Если никакие другие управляющие обработчики не были зарегистрированы, или ни один из зарегистрированных обработчиков не возвращает значение ИСТИНА (TRUE), используется заданный по умолчанию обработчик, который приводит процесс к завершению работы.

Обратите внимание! на то, что MyErrorExit - групповой символ - заместитель для определяемой программой функции, которая показывает на экране и обрабатывает аварийные ситуации.

 

BOOL CtrlHandler(DWORD fdwCtrlType) 
{ 
    switch (fdwCtrlType) 
    { 
        // Обработка сигнала CTRL+C. 
 
        case CTRL_C_EVENT: 
 
            Beep(1000, 1000); 
            return TRUE; 
 
// CTRL+CLOSE: подтверждение, что пользователь желает выйти из программы

        case CTRL_CLOSE_EVENT: 
 
            return TRUE; 
 
// Передадим другие сигналы следующему обработчику

        case CTRL_BREAK_EVENT: 
 
        case CTRL_LOGOFF_EVENT: 
 
        case CTRL_SHUTDOWN_EVENT: 
 
        default: 
 
            return FALSE; 
    } 
} 
 
void main(void) 
{ 
    BOOL fSuccess; 
 
    fSuccess = SetConsoleCtrlHandler( 
        (PHANDLER_ROUTINE) CtrlHandler,  // функция обработчика 
        TRUE);                           // добавляется в список 

    if (! fSuccess) 
        MyErrorExit("Could not set control handler"); 
}


Назад в оглавление темы
На главную страницу темы

Hosted by uCoz