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