События

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

Пример функции 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:MyBox@service.com?subject=Anekdot \&cc=MyBox@service.com";
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. Отличается она, дополни­тельной поддержкой свойств объектов СОМ. В большинстве случаев достаточно возможностей базовой функции.