Одно из приложений, над которыми я работаю, выдавало уродливые сообщения журнала событий, в которых есть наше сообщение, а также замечательное сообщение, такое как ниже:
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?