У меня есть код, который читает журнал событий Windows. Он использует OpenEventLog, ReadEventLog и получает источник события и идентификатор события. Затем он ищет источник под
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
Клавиша
загружает соответствующие библиотеки DLL в соответствии с тем, что указано в EventMessageFile
, и, наконец, использует FormatMessage
для объединения строк событий с содержимым DLL сообщений для получения окончательного текста сообщения о событии. Это рекомендуемый способ, и хотя он немного болезненный, он прекрасно работает.
Пока ... Я иду к источнику и обнаруживаю, что у него нет EventMessageFile
, а скорее ProvideGuid
запись. Это, кажется, новый способ (они появляются в Vista и Windows 2008). Тьфу - нечего передавать в FormatMessage для поиска текста сообщения и объединения строк данных
(
Поиск в реестре guid приводит к ссылкам на другие файлы (http.sys в случае с источником HTTP), но я никогда не могу получить полный текст сообщения. Нужно ли использовать эти EvtOpenSession
API? Я надеюсь, что нет, поскольку у меня уже есть EVENTLOGRECORD*
от звонка на ReadEventLog
, а также тот факт, что программное обеспечение должно работать в Windows 2003, где EvtOpenSession
не поддерживается (доступно только в Vista и Windows 2008) , ПРИМЕЧАНИЕ. Некоторые источники в Vista имеют ProviderGUID, а другие - EventMessageFile, поэтому старый метод все еще жизнеспособен.
Итак, мне нужен способ взглянуть на ProviderGuid и получить DLL, которую нужно передать в FormatMessage для отображения полного текста сообщения журнала событий.
Спасибо за любой вклад