События
Обработка сообщений
Пример функции 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. Отличается она, дополнительной поддержкой свойств объектов СОМ. В большинстве случаев достаточно возможностей базовой функции.