Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

События. Пример функции ReportError для вывода сообщений об ошибках при выполнении системных вызовов




Обработка сообщений

Пример функции ReportError для вывода сообщений об ошибках при выполнении системных вызовов

 

/* Универсальная функция для вывода сообщений о системных ошибках. */

 

#include "EvryThng.h"
VOID ReportError (LPCTSTR UserMessage, DWORD ExitCode, BOOL PrintErrorMsg){
DWORD eMsgLen, LastErr = GetLastError();
LPTSTR lpvSysMsg;
HANDLE hStdErr - GetStdHandle (STD_ERROR_HANDLE);
PrintMsg (hStdErr, UserMessage);
if (PrintErrorMsg){
eMsgLen=FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, LastErr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpvSysMsg, 0, NULL);
PrintStrings (hStdErr, _T (“\n”), lpvSysMsg, _T (n\n")/ NULL);

 

/* Освободить блок памяти, содержащий сообщение об ошибке. */

HeapFree (GetProcessHeap (), 0, lpvSysMsg);
}
if (ExitCode > 0) ExitProcess (ExitCode);
else return;
}

 

Если отслеживать исключения, которые возникают на том или ином участке программы, надо создать блоки try и except:


__try{ /* Блок контролируемого кода */ }
__except(выражение_фильтра){/*Блок обработки исключений*/}
__try и __except - ключевые слова, опознаваемые компилятором.

 

Блоки try являются частью обычного кода приложения. Если на данном уча­стке кода возникает исключение, ОС передает управление обработчику исключений, который представляет собой блок программного кода, следующий за ключевым словом except. Характер последующих действий определяется зна­чением параметра выражение_фильтра. Исключение может возникнуть также в пределах блока, находящегося внутри try-блока; в этом случае средства поддержки време­ни исполнения "разворачивают" стек, чтобы отыскать в нем информацию об об­работчике исключений, после чего передают управление этому обработчику. То же самое происходит и в тех случаях, когда исключения возникают внутри функ­ций, вызванных в пределах try-блока.

 

 

Последним из типов объектов синхронизации ядра являются события (events). Объекты события используются чтобы сиг­нализировать другим потокам о наступлении какого-либо события, например, о появлении нового сообщения. Переход в сигнальное состояние единственного объекта события выведет из состояния ожидания одновременно до несколько потоков. Объекты события делятся на сбрасываемые вручную и автоматические, это их свойство устанавливается при вызове CreateEvent.

 

Сбрасываемые вручную события (manual-reset events) могут сигнализиро­вать одновременно всем потокам, ожидающим наступления этого события, и переводятся в несигнальное состояние программно.

Автоматически сбрасываемые события (auto-reset event) сбрасываются са­мостоятельно после освобождения одного из ожидающих потоков, тогда как другие ожидающие потоки продолжают ожидать перехода события в сигнальное состояние.

 

События используют пять новых функций: CreateEvent, OpenEvent, SetEvent, ResetEvent и CreateEvent.
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpsa, BOOL bManualReset, BOOL bInitialState, LPTCSTR lpEventName)
Чтобы создать событие, сбрасываемое вручную, необходимо установить зна­чение параметра bManualReset равным True. Чтобы сделать на­чальное состояние события сигнальным, установить равным True значение параметра bInitialState. Для открытия именованного объекта события ис­пользуется функция OpenEvent, это может сделать и другой процесс.

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

  • BOOL SetEvent (HANDLE hEvent)
  • BOOL ResetEvent (HANDLE hEvent)
  • BOOL PulseEvent (HANDLE hEvent)

 

Использование функции ShellExecute


#include <shellapi.h>
// открыть страницу в сети Интернет
ShellExecute(NULL, "open", " http://www.MyWebPage.com ", NULL, NULL, SW_SHOWNORMAL);
// открыть текстовый файл, расположенный в папке программы
ShellExecute (NULL, "open", "Readmy.txt", NULL, NULL, SW_SHOWNORMAL);
// вывести на печать файл Word из текущей папки
ShellExecute(NULL, "print", "Document.doc", NULL, NULL, SW_SHOWMINIMIZED);
// найти папку Windows на корневом диске
ShellExecute(NULL, "find", "c:\\Windows", NULL, NULL, SW_HIDE);
// просмотреть папку Windows
ShellExecute(NULL,"explore","c:\\Windows",NULL,NULL, SW_SHOWNORMAL);
// написать письмо
LPCTSTR lpMail = "mailto: [email protected]?subject=Anekdot \&cc= [email protected] ";
ShellExecute (NULL, NULL, lpMail, NULL, NULL, SW_SHOWNORMAL);
// запустить программу из текущей папки
ShellExecute (NULL, NULL, "MyProgramm.exe", "-mycommand", NULL, SW_SHOWNORMAL);
// просмотреть графический файл
ShellExecute(NULL,"open","d:\\images\\pricol.bmp",NULL,NULL,SW_SHOWNORMAL)

 

Кроме основной функции ShellExecute, существует ее расширенный вари­ант, именуемый ShellExecuteEx. Отличается она, дополни­тельной поддержкой свойств объектов СОМ. В большинстве случаев достаточно возможностей базовой функции.




Поделиться с друзьями:


Дата добавления: 2014-10-15; Просмотров: 588; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.