Работа с Реестром ОС WindowsNT/2000/XP, страница 10

Приложение, использующее для записи сообщения в Журнал функцию API Windows, передает не само сообщение (строку), а ее идентификатор (ID). Соответствие сообщений и идентификаторов определено в файле сообщений, который является частью ресурсов приложения. Иными словами, каждое сообщение, которое приложение заносит в Журнал событий, предопределено в ресурсах этого приложения. Когда Windows получает идентификатор сообщения, она записывает его (а не сообщение) в Журнал событий. В результате размер Журнала остается не слишком большим.

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

Категории во многом обрабатываются сходным образом. При записи приложе-; нием информации в Журнал событий с помощью функции API Windows используется идентификатор. Он указывает на текст сообщения, находящийся в разделе сообщений ресурсов приложения. При загрузке программы Просмотр событий она читает информацию из Реестра, чтобы определить, какие библиотеки DLL относятся к различным источникам для данной строки в Журнале. Затем Просмотр событий загружает необходимые библиотеки DLL и с помощью идентификатора находит имя категории.

Обычно для работы с категориями и сообщениями используется одно и то же приложение. Каждое приложение может иметь в своих ресурсах только один раздел сообщений, поэтому сообщения и категории расположены в общем разделе. Для того чтобы отличить сообщения от категорий, в Реестре формируется запись, указывающая номера категорий, находящихся в разделе сообщений. Номера категорий начинаются с идентификатора 0 и увеличиваются на 1. С другой стороны, сообщения могут иметь любой идентификатор, если он не конфликтует с идентификатором категории. Обычно идентификаторы сообщений начинаются с номера 100 и изменяются в сторону увеличения. Рекомендуется идентификаторы сообщений, соответствующих категории 1, начинать с числа 100, идентификаторы сообщений, соответствующих категории 2, — с числа 200 и т. д.

Пример приложения

Давайте создадим приложение, которое будет записывать информацию в Реестр. Простую библиотеку DLL, которую мы будем использовать в нашем примере, можно создать с помощью программы Project Wizard. Ниже объясняется, как это сделать:

1.         Откройте Microsoft Developer Studio.

2.         Выберите File > New.

3.         Выберите Project Workspace.

4.         Дайте проекту имя EvntLog.

5.         Из списка Туре выберите MFC AppWizard (dll).

6.         Выберите настройки по умолчанию.

7.         Щелкните мышью на кнопке Create.

Создание файла сообщений

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

В листинге 8 показан пример синтаксиса файла сообщений.

Листинг 8

MessageID=l

Facility=Application

Sever!ty=Success

SymbolicName=EVCAT_TESTING

Language=English

Тестирование

.

MessageID=100

Facility=Application

Severity=Success

SymbolicName=EVMSG_MEMORYl

Language=English

Пробуем записать  в  Реестр

.

MessageID=101

Facility=Application

Severity=Error

SymbolicName=EVMSG_MEMORY2

Language=English

Пробуем записать  в  Реестр информацию с параметром %1

.

Каждая категория и каждое сообщение должны иметь запись, сходную с приведенной выше, и уникальный идентификатор. Запись о каждом сообщении должна быть отделена точкой (.) и начинаться с новой строки. Обратите внимание, что для сообщения задается идентификатор (MessagelD) и назначается символическое имя (SymbolicName). При компиляции файла сообщений создается заголовочный файл, который может быть включен в исходный код приложения. Это позволит обращаться к идентификатору сообщения по его символическому имени. Например, заголовочный файл для предыдущего примера будет выглядеть так, как показано в листинге 9.