我工作的其中一个应用程序一直在发出丑陋的事件日志消息,这些消息包含我们的消息,但也包含如下的精彩消息:
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中找到?
答案 0 :(得分:2)
事实证明,MSDN论坛上的某个人偶然发现了解决方案并与我分享。
只需取消邮件文件中包含Severity=xxxxx
和Facility=xxxxx
的所有行,一旦重新编译,自定义邮件就会显示出来。 Facility
不在我的文件中,但是另一个人在他的那条线上有这条线,如果没有把这条线拿出去也不行。不知道为什么这些行在很多教程和官方的MSDN文档示例中都有。但它就是。
希望这有助于某人!
答案 1 :(得分:1)
您将MessageId值定义为十六进制,因此0x103转换为259十进制。如果您希望MessageId为十进制103,则使用MessageId = 0x67
答案 2 :(得分:0)
EventId是MessageId,Severity和Facility的组合。我从以下来源中读到了这一点:“指定的任何值必须符合16位。有关如何根据严重性,工具和消息ID形成消息值的更多详细信息,请参阅Winerror.h中的图表。” http://msdn.microsoft.com/en-us/library/windows/desktop/dd996906%28v=vs.85%29.aspx
如果您将“严重性”和“设施”从消息文件中删除,那就是它的工作原理。
答案 3 :(得分:0)
传递给Win32 ReportEvent
调用的dwEventId
参数与消息文件中的MessageId
并不完全相同;相反,它应该由Severity
,Facility
和MessageId
组合而成;如winerror.h
所描述的那样,位移和OR运算。
有帮助的是,除了RC和BIN文件之外,Message Compiler还会发出一个头文件#defines
SymbolicName
从EventId
(如果提供)到每个Severity
的映射信息。因此,如果要在Windows事件日志消息中使用Facility
和Facility
,则可以使用这些常量。
请注意,如果您为任何消息指定了Severity
或Facility
的值,那么对于任何未定义的后续消息,该值将是消息编译器的假定默认值{{ 1}}或Severity
,直到到达消息,指定Facility
或Severity
的值,该值成为新的默认值等等。