Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Функция SetErrorMode – управление реакцией программы на ошибочные состояния




 

Каждый процесс имеет соответствующий режим реакции на ошибочные состояния, который указывает системе, как приложение будет реагировать на критические ошибки. К последним относятся ошибки при работе с дисками, ошибки неготовности устройств, ошибки выравнивания и необработанные исключительные ситуации. Приложение может разрешить системе вывести соответствующее сообщение об ошибке или может обрабатывать ошибку самостоятельно. Для обработки ошибок без вмешательства пользователя надо использовать функцию SetErrorMode():

 

UINT SetErrorMode ( UINT uMode ); {UINT=LongWord}

Параметр uMode может принимать одно из следующих значений или быть их комбинацией:

 

Значение Толкование
0 Обработка ошибок системой по умолчанию, при которой выводится сообщение об ошибке
SEM_FAILCRITICALERRORS Система не выводит сообщение об ошибке, а посылает ошибку процессу
SEM_NOALIGNMENTFAULTEXCEPT Для 64-битной версии Windows: система обрабатывает ошибки выравнивания невидимо для вызывающего процесса процесса и порожденных им другим процессов. После установки этого значения последующие попытки его отмены игнорируются
SEM_NOGPFAULTERRORBOX Система не выводит сообщение об общем нарушении защиты (GP). Этот режим должен устанавливаться только отладчиками, которые обрабатывают такие ошибки самостоятельно с помощью соответствующего обработчика ИС
SEM_NOOPENFILEERRORBOX Сообщение о не найденном файле не выводится, а передается процессу

 

Функция SetErrorMode()  возвращает предыдущий режим.

Обратить внимание пользователя на ошибку или другую ситуацию, требующую его вмешательства, можно с помощью инвертирования (flash) заголовка окна приложения, отображаемого в строке статуса. Обычно этот способ применяют тогда, когда окно приложения неактивно (не имеет фокуса) и требуется вмешательство пользователя. Это можно сделать несколькими подобными способами.

Первый способ – использование метода CWnd::FlashWindow():

BOOL CWnd::FlashWindow(BOOL bInvert);

Вызов этого метода с параметром true изменяет состояние окна с активного на неактивное. Для привлечения внимания пользователя надо это действие проделать неоднократно, например:

 

FlashWindow(TRUE);

Sleep(500);

FlashWindow(TRUE);

Лучше всего, конечно, использовать для этой цели таймер.

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

AfxGetApp()->GetMainWnd()->FlashWindow(true);

Второй (эквивалентный) вариант – вызов глобальной функции FlashWindow() с двумя параметрами:  

::FlashWindow(AfxGetApp()->GetMainWnd()->m_hWnd,true);

 

Если, например, в каком-либо методе класса вида вы просто вызовите FlashWindow(true), то Вы не достигнете желаемого эффекта: заголовок окна просто не будет инвертироваться.

Функция FlashWindowEx() предоставляет дополнительные возможности по управлению визуализацией оповещения пользователя об ошибке. Она имеет такой заголовок:

BOOL FlashWindowEx(DWORD dwFlags, UINT uCount, DWORD dwTimeout);

 

Она позволяет задать интервал инвертирования заголовка окна dwTimeout в миллисекундах и число повторений инвертирования uCount. Параметр dwFlags предоставляет программисту дополнительные возможности по управлению работой функции (см. MSDN). Функция-член CWnd::FlashWindowEx() может быть использована, например, так:

AfxGetApp()->GetMainWnd()->FlashWindowEx(FLASHW_ALL, 3, 300);

 

Имеется глобальный вариант этой функции:

function FlashWindowEx(var pfwi: FLASHWINFO): BOOL;

PFLASHWINFO = ^FLASHWINFO;

FLASHWINFO = record

cbSize: UINT;

hwnd: HWND;

dwFlags: DWORD;

uCount: UINT;

dwTimeout: DWORD;

end;

 

Пример использования функции:

FLASHWINFO fw={sizeof(fw),AfxGetApp()->GetMainWnd()->m_hWnd, FLASHW_ALL,5,500};

::FlashWindowEx(&fw);

 

Внимание слепого, но не хлухого пользователя, можно привлечь звуковым сигналом:

MessageBeep(-1);

 

Вызов этой функции с параметром -1 вызывает одиночный звуковой сигнал, подаваемый через звуковую карту или, в случае ее отсутствия, через встроенный динамик. Другие возможные значения параметров этой функции имеются в MSDN.

Функции GetLastError и SetLastError – получение кода ошибки и его установка

Функции обычно сообщают о наличии ошибки путем возвращения значений 0, -1 или Null, которые могут быть проанализированы вызывающей программной единицей. Кроме того, система предоставляет возможность установить внутренний код ошибки, называемый кодом последней ошибки (last-error code). Если функция завершается успешно, она, обычно, не устанавливает код ошибки; в противном случае она может сделать это с помощью функции SetLastError():

VOID SetLastError( DWORD dwErrCode);

 

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

Получить код ошибки можно с помощью функции GetLastError():

DWORD GetLastError(VOID); 

 

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

Значения системных кодов сообщений (их несколько сотен) об ошибках можно узнать из файла Windows.h или из раздела MSDN System Error Codes.

Приложение для аварийного завершения работы может использовать функцию FatalAppExit():

VOID FatalAppExit(

UINT uAction,         // зарезервировано

LPCTSTR lpMessageText // строка с завершающим нулем длиной до 35 символов

);

 

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

 

Коды ошибок HRESULT

Обработка ошибок при работе с СОМ объектами с точки зрения клиентского приложения основана на использовании значения HResult, возвращаемого функциями СОМ библиотек и методами СОМ объектов. Разработчик СОМ объекта со своей стороны должен приложить усилия для того, чтобы предоставить пользователям СОМ объектов возможность получить код ошибки и ее текстовое представление. Рассмотрим сначала механизм обработки ошибок клиентским приложением.

Значение HResult, возвращаемое большинством API-функций и методов СОМ, представляет собой 32-битовое целое число определенного формата:

Кодировка HResult

Биты Обозначение Значение
31 severity code Бит наличия ошибки (1 – ошибка есть, 0 – ошибки нет)
27..30 reserved Зарезервированы
16..26 facility code Область, ответственная за ошибку
0..15   Код, идентифицирующий ошибку или предупреждение

 

Коды областей (facility code) зарезервированы Microsoft и являются уникальными. В настоящее время определены коды областей, приведенные в следующей таблице.

Константа Значение Описание
FACILITY_NULL 0 Общие коды состояния (типа S_OK)
FACILITY_RPC 1 Ошибки RPC
FACILITY_DISPATCH 2 Ошибки интерфейса IDispatch для позднего связывания
FACILITY_STORAGE 3 Ошибки IStorage и IStream. Коды со значением до 256, имеют тот же смысл, что и коды ошибок DOS
FACILITY_ITF 4 Коды состояния, возвращаемые большинством методов интерфейсов. Действительный смысл ошибки определяется каждым интерфейсом в отдельности. Из этого следует, что два одинаковых значения, возвращенные разными интерфейсами, могут иметь различный смысл
FACILITY_WIN32 7 Коды ошибок функций Win32, возвращающих значения типа HResult
FACILITY_WINDOWS 8 Дополнительные коды ошибок интерфейсов, определенных Microsoft

 

 

Для задания кодов ошибок в Windows используются константы в таком формате:

<Facility>_<Severity>_<Reason>

 

Здесь:

 

<Facility> – имя области или другой отличающий идентификатор (исключается для FACILITY_NULL);

<Severity> – буква S или E, обозначающая успех или ошибку;

<Reason> – идентификатор, поясняющий причину ошибки.

 

Примеры:

 

S_OK                    (FACILITY_NULL)










Последнее изменение этой страницы: 2018-04-12; просмотров: 679.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...