我所工作的应用程序一直在输出丑陋的事件日志消息,其中包含我们的消息以及以下精彩消息:
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
.
I then compile this file as normal:
"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中找到类别却找不到消息吗?