【发布时间】:2012-02-27 17:14:49
【问题描述】:
我工作的一个应用程序一直在吐出丑陋的事件日志消息,其中包含我们的消息,但也有如下精彩消息:
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 中找到了类别?
【问题讨论】:
-
编辑:作为进一步的信息,使用 Resource Hacker 我可以打开已编译的资源文件,其中包含所有消息。
-
用 SDK 7.1 而不是 7.0A 编译似乎也没什么区别。