我有读取 Windows 事件日志的代码。它使用 OpenEventLog、ReadEventLog 并获取事件源和事件 ID。然后它在下面查找源
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application
键,根据其中列出的内容加载适当的 DLL EventMessageFile
,最后用于FormatMessage
将事件字符串与消息 DLL 内容合并以获得最终的事件消息文本。这是推荐的方法,虽然有点痛苦,但效果很好。
直到...我去查找源并发现它没有一个EventMessageFile
,而是一个ProvideGuid
条目。这似乎是一种新方式(它们出现在 Vista 和 Windows 2008 上)。Uggh - 没有任何东西可以传递给 FormatMessage 来查找消息文本并合并到数据字符串中
:(
在注册表中搜索 guid 确实会导致对其他文件的引用(在 HTTP 源的情况下为 http.sys),但我永远无法获得完整的消息文本。我必须使用这些EvtOpenSession
API 吗?我希望不会,因为我已经EVENTLOGRECORD*
调用了 to ReadEventLog
,并且该软件需要在EvtOpenSession
不受支持的 Windows 2003 上运行(仅在 Vista 和 Windows 2008 上可用)。注意:Vista 上的某些源具有 ProviderGUID,而另一些具有 EventMessageFile,因此旧方法仍然可行。
因此,我所追求的是一种查看 ProviderGuid 并获取需要传递给 FormatMessage 以显示完整事件日志消息文本的 DLL 的方法。
感谢您的任何意见