我正在根据本教程尝试使用C创建自己的Windows服务。我的事件消息定义文件如下所示
EventLogMessages.mc:
MessageIdTypedef=DWORD
SeverityNames=(
Success=0x0:STATUS_SEVERITY_SUCCESS
Info=0x1:STATUS_SEVERITY_INFO
Warning=0x2:STATUS_SEVERITY_WARNING
Error=0x3:STATUS_SEVERITY_ERROR
)
FacilityNames=(
System=0x0:FACILITY_SYSTEM
Runtime=0x2:FACILITY_RUNTIME
Stubs=0x3:FACILITY_STUBS
Io=0x4:FACILITY_IO_ERROR_CODE
)
LanguageNames=(English=0x409:MSG00409)
; // The following are message definitions.
MessageId=0x1
Severity=Success
Facility=Runtime
SymbolicName=SVCEVENT_STATUS_REPORT
Language=English
Status report: %2.
.
MessageId=0x2
Severity=Error
Facility=System
SymbolicName=SVCEVENT_INIT_SYSCALL_ERROR
Language=English
Essential syscall failed when starting the service: %2.
.
MessageId=0x3
Severity=Error
Facility=Runtime
SymbolicName=SVCEVENT_CUSTOM_ERROR
Language=English
Service-specific error: %2.
.
; // A message file must end with a period on its own line
; // followed by a blank line.
它几乎是docs样本文件的副本。
但是,每当我编译此文件,启动服务并打开事件查看器时,我都会将来自服务的所有消息视为“级别:错误”,即使是严重性较低的消息。
事件ID和消息是正确的,但是严重性始终是错误的。
我打开了生成的头文件EventLogMessages.h
,这里看起来也不错。
#define SVCEVENT_STATUS_REPORT ((DWORD)0x00020001L)
高2位(指示严重性)已正确设置为0-STATUS_SEVERITY_SUCCESS。但是无论如何,事件始终显示为错误。
任何人都有线索为什么会出错以及如何解决?
所以我通过反复试验弄清楚了。
严重性实际上仅由ReportEvent的第二个参数控制,并且messageID
(来自.mc文件并转到第四个参数)的高位完全被忽略。
因此,发送“警告”事件,而不是定义消息属性,例如
MessageId=0x2
Severity=Warning
Facility=Runtime
SymbolicName=SVCEVENT_WARNING
...
您需要以这种方式调用该函数
ReportEvent( hEventSource, EVENTLOG_WARNING_TYPE, 0, SVCEVENT_WARNING, ... );
不确定什么是消息严重性是否适合,但是它可以工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句