Ошибка файла сообщения журнала событий - PullRequest
4 голосов
/ 27 февраля 2012

Одним из приложений, над которым я работаю, было выплевывание некрасивых сообщений в журнале событий, в которых есть наше сообщение, а также замечательное сообщение, например ниже:

The description for Event ID 103 from source MyCustomSource cannot be found. Either  the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.

If the event originated on another computer, the display information had to be saved with the event.

The following information was included with the event: 

My event log message that is redacted.

the message resource is present but the message is not found in the string/message table

Итак, я пошел по пути создания файла сообщений журнала событий для этого источника, звучит довольно просто, верно?

;// Header
MessageIdTypedef=DWORD

LanguageNames=(
    English=0x409:MSG00409
)

;// Categories
MessageId=0x1
SymbolicName=MYAPP_CATEGORY_GENERAL
Language=English
MyApp General
.

;// Messages
MessageId=0x103
SymbolicName=API_ERROR
Severity=Error
Language=English
An error occurred in the API. Message: %1
.

Затем я скомпилирую этот файл как обычно:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\mc.exe" -u MyAppMessages.mc"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\rc.exe" -r MyAppMessages.rc"
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\link.exe" -dll -noentry -out:MyAppMessages.dll MyAppMessages.res /MACHINE:x86

Теперь у меня есть скомпилированный MyAppMessages.dll. Теперь я добавлю необходимые записи реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\MyApp\MyApp
CategoryCount    REG_DWORD    1
CategoryMessageFile REG_EXPAND_SZ <path to MyAppMessages.dll>
EventMessageFile REG_EXPAND_SZ <path to MyAppMessages.dll>

Проблема в том, что я все еще получаю то же сообщение, что и в начале, только категория задач теперь загружает правильное значение из файла сообщений вместо значения по умолчанию (1), которое загружалось ранее.

Это XML данных события:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="MyApp" /> 
    <EventID Qualifiers="57344">103</EventID> 
    <Level>2</Level> 
    <Task>1</Task> 
    <Keywords>0x80000000000000</Keywords> 
    <TimeCreated SystemTime="2012-02-27T16:42:20.000000000Z" /> 
    <EventRecordID>20759</EventRecordID> 
    <Channel>MyApp</Channel> 
    <Computer>Skycaller</Computer> 
    <Security /> 
  </System>
  <EventData>
    <Data>My event log message that is redacted.</Data> 
  </EventData>
</Event>

Я не эксперт по файлам сообщений, но он находит определение категории в файле сообщений, но не сообщение о событии. Кто-нибудь знает, почему сообщение не может быть найдено, но категория находится в той же DLL?

Ответы [ 4 ]

2 голосов
/ 15 августа 2012

Оказывается, кто-то на форумах MSDN случайно наткнулся на решение этой проблемы и поделился им со мной.

Просто удалите все строки с Severity=xxxxx и Facility=xxxxx в файле сообщений, и пользовательские сообщения появятся после перекомпиляции. Facility не было в моем файле, но у другого парня была эта строка в его, и это не сработало бы для него, если не вынуть эту строку тоже. Понятия не имею, почему эти строки есть во многих руководствах и официальных примерах документации MSDN, но это так.

Надеюсь, это кому-нибудь поможет!

1 голос
/ 18 мая 2012

Вы определили свои значения MessageId как шестнадцатеричные, поэтому 0x103 преобразуется в 259 десятичных.Если вы хотите, чтобы ваш MessageId был 103 десятичным, используйте MessageId = 0x67

0 голосов
/ 14 января 2015

Аргумент dwEventId, который передается на вызов Win32 ReportEvent, строго не совпадает с MessageId в вашем файле сообщений;скорее это должно быть построено из Severity, Facility и MessageId вместе взятых;bithifted и OR'd, как описано в winerror.h.

. В дополнение к этому компилятор сообщений в дополнение к файлу RC и BIN также выделяет заголовочный файл, который #defines сопоставляет SymbolicName (еслипри условии) правильный EventId для каждого сообщения.Таким образом, вы можете просто использовать эти константы, если хотите использовать Severity и Facility в сообщениях журнала событий Windows.

Обратите внимание, что если вы укажете значение для Facility или Severityдля любого сообщения это значение будет приниматься по умолчанию Компилятором сообщений для любых последующих сообщений, которые не определяют Facility или Severity, до тех пор, пока не будет достигнуто сообщение, в котором указано значение для Facility или Severityкоторый становится новым значением по умолчанию и т. д. и т. д.

0 голосов
/ 26 февраля 2014

EventId - это комбинация из MessageId, Severity и Facility.Я прочитал это из следующего источника: «Любое указанное значение должно умещаться в 16 бит. Для получения дополнительной информации о том, как значение сообщения формируется из серьезности, средства и идентификатора сообщения, см. Диаграмму в Winerror.h»http://msdn.microsoft.com/en-us/library/windows/desktop/dd996906%28v=vs.85%29.aspx

Вот почему это работает, если вы удалите серьезность и средство из файла сообщения.

...