Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Функция SetErrorMode – управление реакцией программы на ошибочные состояния
Каждый процесс имеет соответствующий режим реакции на ошибочные состояния, который указывает системе, как приложение будет реагировать на критические ошибки. К последним относятся ошибки при работе с дисками, ошибки неготовности устройств, ошибки выравнивания и необработанные исключительные ситуации. Приложение может разрешить системе вывести соответствующее сообщение об ошибке или может обрабатывать ошибку самостоятельно. Для обработки ошибок без вмешательства пользователя надо использовать функцию SetErrorMode():
UINT SetErrorMode ( UINT uMode ); {UINT=LongWord} Параметр uMode может принимать одно из следующих значений или быть их комбинацией:
Функция 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
Коды областей (facility code) зарезервированы Microsoft и являются уникальными. В настоящее время определены коды областей, приведенные в следующей таблице.
Для задания кодов ошибок в Windows используются константы в таком формате: <Facility>_<Severity>_<Reason>
Здесь:
<Facility> – имя области или другой отличающий идентификатор (исключается для FACILITY_NULL); <Severity> – буква S или E, обозначающая успех или ошибку; <Reason> – идентификатор, поясняющий причину ошибки.
Примеры:
S_OK (FACILITY_NULL) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-04-12; просмотров: 703. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |