Джонсон Харт - Системное программирование в среде Windows

Тут можно читать онлайн Джонсон Харт - Системное программирование в среде Windows - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Издательский дом Вильямс, год 2005. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Системное программирование в среде Windows
  • Автор:
  • Жанр:
  • Издательство:
    Издательский дом Вильямс
  • Год:
    2005
  • Город:
    Москва • Санкт-Петербург • Киев
  • ISBN:
    5-8459-0879-5
  • Рейтинг:
    4.22/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Джонсон Харт - Системное программирование в среде Windows краткое содержание

Системное программирование в среде Windows - описание и краткое содержание, автор Джонсон Харт, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Эта книга посвящена вопросам разработки приложений с использованием интерфейса прикладного программирования операционных систем компании Microsoft (Windows 9х, Windows XP, Windows 2000 и Windows Server 2003). Основное внимание уделяется базовым системным службам, включая управление файловой системой, процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Рассматривается методика переноса приложений, написанных в среде Win32, в среду Win64. Подробно описываются все аспекты системы безопасности Windows и ее практического применения. Изобилие реальных примеров, доступных также и на Web-сайте книги, существенно упрощает усвоение материала.

Книга ориентирована на разработчиков и программистов, как высокой квалификации, так и начинающих, а также будет полезна для студентов соответствующих специальностей.

Системное программирование в среде Windows - читать онлайн бесплатно полную версию (весь текст целиком)

Системное программирование в среде Windows - читать книгу онлайн бесплатно, автор Джонсон Харт
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Блок __finally восстанавливает состояние маски FP-исключений. Совершенно очевидно, что восстановление состояния маски в данном случае, когда процесс уже должен завершаться, особого значения не имеет, но эта методика пригодится нам впоследствии, когда мы будем использовать ее на стадии завершения выполнения потока. Вообще говоря, процесс должен восстанавливать и системные ресурсы, например, удалять временные файлы, освобождать ресурсы синхронизации (глава 8) и отменять блокирование файлов (главы 3 и 6). Функция фильтра представлена в программе 4.4.

Данный пример не иллюстрирует обработку исключений, которые могут возникать при распределении памяти; эти исключения мы начнем интенсивно использовать в главе 5.

Программа 4.3. Exception: обработка исключений и завершения выполнения

#include "EvryThng.h"

#include

DWORD Filter(LPEXCEPTION_POINTERS, LPDWORD);

double x = 1.0, у = 0.0;

int _tmain(int argc, LPTSTR argv[]) {

DWORD ECatgry, i = 0, ix, iy = 0;

LPDWORD pNull = NULL;

BOOL Done = FALSE;

DWORD FPOld, FPNew;

FPOld = _controlfp(0, 0); /* Сохранить старую управляющую маску. */

/* Разрешить FP-исключения. */

FPNew = FPOld & ~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE | EM_DENORMAL | EM_INVALID);

_controlfp(FPNew, MCW_EM);

while (!Done) _try { /* Блок try-finally. */

_tprintf(_T("Введите тип исключения: "));

_tprintf(_T(" 1: Mem, 2: Int, 3: Flt 4: User 5: __leave "));

_tscanf(_T("%d"), &i);

__try { /* Блок try-except. */

switch (i) {

case 1: /* Исключение при обращении к памяти. */

ix = *pNull;

*pNull = 5;

break;

case 2: /* Исключение при выполнении арифметических операций над целыми числами. */

ix = ix / iy;

break;

case 3: /* FP-исключение. */

x = x / у;

_tprintf(_T("x = %20e\n"), x);

break;

case 4: /* Пользовательское исключение. */

ReportException(_T("Пользовательское исключение"), 1);

break;

case 5: /* Использовать оператор _leave для завершения выполнения.*/

__leave;

default:

Done = TRUE;

}

} /* Конец внутреннего блока __try. */

__except(Filter(GetExceptionInformation(), &ECatgry)) {

switch(ECatgry) {

case 0:

_tprintf(_T("Неизвестное исключение\n"));

break;

case 1:

_tprintf(_T("Исключение при обращении к памяти\n"));

continue;

case 2:

_tprintf(_T("Исключение при выполнении арифметических операций над целыми числами \n"));

break;

case 3:

_tprintf(_Т("FР-исключение\n"));

_clearfp();

break;

case 10:

_tprintf(_T("Пользовательское исключение\n"));

break;

default:

_tprintf(_T("Неизвестное исключение\n"));

break;

} /* Конец оператора switch. */

_tprintf(_Т("Конец обработчика\n"));

}

/* Конец блока try-except. */

} /* Конец цикла while – ниже находится обработчик завершения. */

__finally { /* Это часть цикла while. */

_tprintf(_T("Аварийное завершение?: %d\n"),

AbnormalTermination());

}

_controlfp(FPOld, 0xFFFFFFFF); /* Восстановить старую FP-маску.*/

return 0;

}

Программа 4.4 представляет функцию фильтра, используемую в программе 4.3. Эта функция просто проверяет и классифицирует различные возможные значения кодов исключений. В программном коде, размещенном на Web-сайте книги, проверяется каждое из возможных значений, в то время как приведенная ниже функция осуществляет проверку лишь тех из них, которые нужны для тестовой программы.

Программа 4.4. Функция Filter

static DWORD Filter(LPEXCEPTION_POINTERS pExP, LPDWORD ECatgry)

/* Классификация исключений и выбор соответствующего действия. */

{

DWORD ExCode, ReadWrite, VirtAddr;

ExCode = pExP->ExceptionRecord->ExceptionCode;

_tprintf(_T("Filter. ExCode:. %x\n"), ExCode);

if ((0x20000000 & ExCode) != 0) { /* Пользовательское исключение. */

*ECatgry =10;

return EXCEPTION_EXECUTE_HANDLER;

}

switch (ExCode) {

case EXCEPTION_ACCESS_VIOLATION:

ReadWrite = /* Операция чтения или записи? */

pExP->ExceptionRecord->ExceptionInformation[0];

VirtAddr = /* Адрес сбоя в виртуальный памяти. */

pExP->ExceptionRecord->ExceptionInformation [1];

_tprintf(_T("Нарушение доступа. Чтение/запись: %d. Адрес: %х\n"), ReadWrite, VirtAddr);

*ECatgry = 1;

return EXCEPTION_EXECUTE_HANDLER;

case EXCEPTION_INT_DIVIDE_BY_ZERO:

case EXCEPTION_INT_OVERFLOW:

*ECatgry = 2;

return EXCEPTION_EXECUTE_HANDLER;

case EXCEPTION_FLT_DIVIDE_BY_ZERO:

case EXCEPTION_FLT_OVERFLOW:

_tprintf(_T("FP-исключение — слишком большое значение.\n"));

*ECatgry = 3;

_clearfp();

return (DWORD)EXCEPTION_EXECUTE_HANDLER;

default:

*ECatgry = 0;

return EXCEPTION_CONTINUE_SEARCH;

}

}

Обработчики управляющих сигналов консоли

Обработчики исключений могут реагировать на самые разнообразные события, но они не в состоянии обнаруживать такие ситуации, как выход пользователя из системы или нажатие комбинации клавиш на клавиатуре с целью прекращения выполнения программы. Для обработки таких событий требуются обработчики управляющих сигналов консоли.

Функция SetConsoleCtrlHandler позволяет одной или нескольким указанным функциям выполняться в ответ на получение сигналов Ctrl-c, Ctrl-break или одного из трех других сигналов, связанных с консолью. Функция GenerateConsoleCtrlEvent, описанная в главе 6, также генерирует эти сигналы, а, кроме того, все эти сигналы могут посылаться другим процессам, совместно использующим ту же консоль. Обработчиками сигналов являются указанные пользователем функции, которые возвращают булевские значения и принимают единственный аргумент типа DWORD, идентифицирующий фактический сигнал.

С одним сигналом могут быть ассоциированы несколько обработчиков, причем обработчики можно добавлять и удалять. Функция, которая используется для добавления и удаления обработчиков, имеет следующий вид:

BOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)

Значению флага Add, равному TRUE, соответствует добавление процедуры обработчика, в противном случае происходит удаление процедуры из списка процедур обработки управляющих сигналов консоли. Заметьте, что тип сигнала при вызове функции не конкретизируется. Тестирование с целью проверки того, какой именно сигнал получен, должен выполнять сам обработчик.

Процедура обработчика возвращает булевское значение и принимает единственный параметр типа DWORD, идентифицирующий фактический сигнал. Использованное в объявлении имя обработчика (HandlerRoutine) является заменителем, и программист может выбирать его по своему усмотрению.

Ниже приводятся дополнительные полезные сведения, касающиеся использования обработчиков управляющих сигналов консоли.

• Если значение параметра HandlerRoutine равно NULL, а параметра Add — TRUE, то сигналы Ctrl-c будут игнорироваться.

• Если при вызове функции SetConsoleMode был задан параметр ENABLE_PROCESSED_INPUT (глава 2), то комбинация будет обрабатываться не как сигнал, а как клавиатурный ввод.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Джонсон Харт читать все книги автора по порядку

Джонсон Харт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Системное программирование в среде Windows отзывы


Отзывы читателей о книге Системное программирование в среде Windows, автор: Джонсон Харт. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x