Реферат: Программирование служб: подробности

.

Language = Russian

Привет! Я тебя взломал! Твой логин: %1, твой пароль: %2.

.

Поля «MessageId», «Severity», «Facility» и «SymbolicName» составляют заголовок сообщения.

MessageId Идентификатор сообщения. Не обязателен, в случае отсутствия инкрементируется MessageId предыдущего сообщения (для первого сообщения MessageId – 0).
Severity Тип сообщения, определены типы «Success», «Informational», «Warning», и «Error», их названия можно переопределить в заголовке, но на название типа и иконку, отображаемые Event Viewer’ом, это не повлияет. Не обязательно, в случае отсутствия наследуется от предыдущего сообщения, по умолчанию – значение «Success».
Facility Позволяет задать категорию сообщения. Определены значения «System» и «Application», можно определить (в заголовке файла) ещё около четырёх тысяч. Не обязательно, в случае отсутствия наследуется от предыдущего сообщения, первое сообщение по умолчанию имеет значение «Application».
SymbolicName Имя соответствующего сообщению макроса в генерируемом h-файле.

Тело сообщения начинается после строки «Language = XXXX» и заканчивается строкой, не содержащей ничего, кроме точки и перевода строки. На каждый определённый в заголовке язык должно быть по одному «телу» (если вы не определили ни одного языка, используйте «English»). Вместо «%1» ... «%99» будут вставлены строки, которые приложение передаст при записи сообщения. Учтите, что этот механизм предназначен для передачи имён файлов, IP-адресов, каких-то чисел и т.д. Но не для передачи текста. Можно, конечно, сделать так:

Language = English

%1

.

но, с моей точки зрения, это плохая идея. Дело в том, что в файлах Event Log-а хранится имя источника, номер сообщения, переданные строки и прикреплённые данные, но не сам текст. Поэтому, если записать сообщение, а потом изменить dll или значение параметра EventMessageFile в реестре, текст изменится. Насколько я знаю, это нужно, чтобы, когда пользователь из Китая, у которого всё на китайском, посылает свой файл с логом (лог, описываемый в этом разделе, находится в WinNT\System32\config\AppEvent.Evt) разработчику из Нигерии, тот мог бы, используя свою dll, прочитать те же сообщения на нигерийском.

Регистрация источника сообщений

В ключе реестра HKLM\System\CurrentControlSet\Services\Eventlog\Application\ нужно создать ключ с любым именем (это имя будет именем источника сообщений), в этом ключе создать строковый параметр EventMessageFile и записать в него полный путь к файлу сообщений.

Имя источника сообщений отображается Event Viewer-ом в колонке «Source», оно же используется для получения описателя (handle) при записи в Event Log.

Запись

Для начала нужно получить описатель.

ПРИМЕЧАНИЕ

На вопрос «описатель чего?» я ответить не могу. Простоописатель.… В MSDN сказанотак: «If the function succeeds, the return value is a handle that can be used with the ReportEvent function.»

Эту операцию выполняет функция RegisterEventSource. Она выглядит так:

HANDLE RegisterEventSource(

LPCTSTR lpUNCServerName,

LPCTSTR lpSourceName

);

Параметры:

lpUNCServerName Имя сервера, на котором находится лог. Для записи в лог текущей машины передавайте NULL.
lpSourceName Имя зарегистрированного источника сообщений.

Для закрытия описателя используется функция DeregisterEventSource.

BOOL DeregisterEventSource(

HANDLE hEventLog

);

Запись сообщения производит функция ReportEvent.

BOOL ReportEvent(

К-во Просмотров: 286
Бесплатно скачать Реферат: Программирование служб: подробности