Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора 97.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
778.75 Кб
Скачать

Параметры

dwExceptionCode — код, определяемый пользователем. Не используйте бит 28, который зарезервирован для системы. Код ошибки устанавливается в битах 27-0 (т.е. во всех, кроме самой старшей шестнадцатеричной цифры). Бит 29 устанавливается для обозначения "заказного" исключения (не Microsoft). Биты 31—30 указывают строгость исключения. Ниже показано, как это делается, причем начальная шестнадцатеричная цифра кода показана для случая, когда бит 29 установлен.

  • 0 — успех (начальная цифра 2).

  • 1 — информационный (начальная цифра 6).

  • 2 — предупреждение (начальная цифра А).

  • 3 — ошибка (начальная цифра Е).

Параметр dwExceptionFIags обычно устанавливается в 0, но установка значения в EXCEPTION_NONCONTINUABLE указывает, что выражение фильтра не должно генерировать EXCEPTION_CONTINUE_EXECUTION; если это будет так, произойдет немедлен­ное исключение EXCEPTION_NONCONTINUABLE.

Параметр lpArguments, если не имеет значения NULL, указывает на массив разме­ра cArguments (третий параметр), содержащий 32-разрядные значения, которые будут переданы в выражение фильтра. Максимально допустимое количество параметров EXCEPTION_MAXIMUM_PARAMETERS в настоящее время равно 15. Обращаться к этой структуре следует через GetExceptionInformation.

Обработчики завершения

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

Обработчик завершения создается с помощью ключевого слова __finally в операторе try-finally. Его структура такая же, как и у оператора try-except, однако здесь нет выражения фильтра. Обработчики завершения, подобно обработчикам исключений, дают удобный способ закрытия дескрипторов, освобождения ресурсов, восстановления масок и других действий по возвращению процесса в определенное состояние перед выходом из блока. Например, программа может выполнять операторы return в середине блока, а обработчик завершения будет выполнять работу по очистке. Таким образом, не требуется ни вставлять код очистки непосредственно в блок, ни прибегать к оператору goto, чтобы перейти к этому коду.

__try { /* Блок кода. */ }

__finally { /* Обработчик завершения (блок finally). */ }

Выход из блока Try

Обработчик завершения выполняется всякий раз, когда управление выходит из блока try по любой из следующих причин:

  • достигается конец блока try и управление "проваливается" в обработчик завершения;

  • выполняется один из следующих операторов, которые вызывают выход из блока:

return, break, goto, longjmp, continue, __leave

• исключение.

Аварийное завершение

Завершение по любой другой причине, отличной от достижения конца блока и перехода к обработчику завершения или выполнения оператора __leave, считается аварийным. Оператор __leave выполняет переход к концу блока __try и вызов обработчика завершения, что более эффективно, чем goto, так как в этом случае не требуется разворачивать стек. В обработчике завершения можно применять следующую функцию, чтобы определить, как завершился блок try:

BOOL AbnormalTermination (VOID)

Функция возвращает TRUE при аварийном завершении и FALSE при нормальном завершении.

Выполнение обработчика завершения и выход из него

Обработчик завершения, или блок finally, выполняется в контексте блока или функции, которую он контролирует. Управление может передаваться с конца обработчика завершения на следующий оператор. Также в обработчике завершения может выполняться оператор перехода (return, break, continue, goto, longjmp или __leave). Еще один вариант — выход из обработчика по исключению.

Сочетание блоков Finally и Except

Отдельный блок try должен иметь один блок finally или except; оба блока сра­зу не допускаются. Но можно вложить один блок в другой; часто этот метод оказывается полезным. Следующий код правилен и гарантирует, что временный файл будет удален при выхо­де из цикла как по логике программы, так и по исключению. Эта методика также полезна для того, чтобы гарантировать разблокирование файла. Можно также применить внутренний блок try-except для операций с плавающей запятой.

try { /* Внешний блок try-except. */

while (...) try ( /* Внутренний блок try-finally. */

hFile = CreateFile (TempFile, ...);

if (...) try { /* Внутренний блок try-except. */

/* Разрешение исключений ПЗ и выполнение вычислений. */

}

except (EXCEPTION EXECUTE HANDLER) {

... /* Обработка исключения ПЗ. */ _clearfp (); }

... /* Обработка, не связанная с ПЗ. */ }

finally { /* Конец цикла while loop. */

/* Выполняется на КАЖДОЙ итерации цикла */

CloseHandle (hFile); DeleteFile (TempFile); } }

except (выражение_фильтра) {

/* Обработчик исключения. */ }

Лекция 15. Тема: Межпроцессное взаимодействие

Двумя основными механизмами Win32 для обеспечения межпроцессного взаимодействия (interprocess communication, IPC) являются анонимный канал и именованный канал.

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

Анонимные каналы

Анонимные каналы Win32 позволяют проводить одностороннее (полудуплексное), символьно-ориентированное межпроцессное взаимодействие. Каждый канал имеет два дескриптора: дескриптор чтения и дескриптор записи. Для создания канала слу­жит следующая функция CreatePipe:

BOOL CreatePipe ( PHANDLE phRead, PHANDLE phWrite, LPSECURITY_ATTRIBUTES lpsa, DWORD cbPipe)

Чтобы использовать канал для IPC, нужен еще один процесс, с которым будет свя­зан один из дескрипторов канала.

Чтение из дескриптора чтения канала блокируется, если канал пуст. В противном случае считывается столько байтов, сколько имеется в канале, но не превышая коли­чества, указанного при вызове ReadFile. Также блокируется операция записи в за­полненный канал, который реализуется в буфере памяти.

Кроме всего прочего, анонимные каналы пропускают данные только в одну сторо­ну. Для двунаправленной связи нужны два канала.

Именованные каналы

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

  • Именованные каналы ориентированы на сообщения, так что читающий процесс может читать сообщения переменной длины точно так, как они передаются записывающим процессом.

  • Именованные каналы двунаправлены, так что два процесса могут обмениваться сообщениями по одному и тому же каналу.

  • Может быть несколько независимых экземпляров именованного канала. На­ пример, несколько клиентов могут связываться с одним сервером, используя один и тот же канал, и сервер может ответить клиенту по тому же экземпляру канала.

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

  • Существует несколько функций-полуфабрикатов, упрощающих взаимодействие по именованному каналу и соединение клиента с сервером.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]