Windows 事件查看器显示来自我的服务的所有消息的严重性错误

Windows Event Viewer shows wrong severity for all messages from my service

我正在尝试根据此 tutorial 在 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, ... );

不确定什么消息严重性适合当时,但它有效。