EventWriteString 函数 (evntprov.h)
写入包含字符串作为其数据的 ETW 事件。 不应使用此函数。
语法
ULONG EVNTAPI EventWriteString(
[in] REGHANDLE RegHandle,
[in] UCHAR Level,
[in] ULONGLONG Keyword,
[in] PCWSTR String
);
参数
[in] RegHandle
提供程序的注册句柄。 句柄来自 EventRegister。 生成的事件将使用与句柄关联的 ProviderId。
[in] Level
用于描述事件的严重性或重要性的 8 位数字。
重要
ProviderId、Level 和 Keyword 是筛选事件的主要方式。 可以进行其他类型的筛选,但开销要高得多。 始终为每个事件分配非零级别和关键字 (keyword) 。
有关事件级别的详细信息,请参阅 EVENT_DESCRIPTOR 。
[in] Keyword
一个 64 位位掩码,用于指示事件在一组事件类别中的成员身份。
重要
ProviderId、Level 和 Keyword 是筛选事件的主要方式。 可以进行其他类型的筛选,但开销要高得多。 始终为每个事件分配非零级别和关键字 (keyword) 。
有关事件关键字 (keyword) 的详细信息,请参阅EVENT_DESCRIPTOR。
[in] String
要写入为事件数据的 NUL 终止字符串。
返回值
如果成功或错误代码,则返回 ERROR_SUCCESS 。 可能的错误代码包括以下内容:
- ERROR_INVALID_PARAMETER:一个或多个参数无效。
- ERROR_INVALID_HANDLE:提供程序的注册句柄无效。
- ERROR_ARITHMETIC_OVERFLOW:事件大小大于允许的最大 (64KB - 标头) 。
- ERROR_MORE_DATA:会话缓冲区大小对于事件来说太小。
- ERROR_NOT_ENOUGH_MEMORY:当已填充缓冲区尝试刷新到磁盘,但磁盘 IO 发生速度不够快时发生。 当磁盘速度较慢且事件流量较重时,会发生这种情况。 最终,空) 缓冲区 (不再可用,事件将被删除。
- STATUS_LOG_FILE_FULL:实时播放文件已满。 在实时使用者使用播放文件中的事件之前,事件不会记录到会话中。
错误代码主要用于调试和诊断方案。 大多数生产代码应继续运行并继续报告事件,即使无法编写 ETW 事件,因此发布版本通常应忽略错误代码。
备注
此 API 没有用,不应使用。
- 大多数 ETW 分析工具不支持没有清单的仅字符串事件。
- 如果没有清单,则有关事件 (重要信息(例如提供程序名称、事件 ID 和事件名称) )不可用,因此即使分析工具支持仅字符串事件,生成的事件也很难使用。
- 对于清单,此函数的行为几乎与基于清单的事件中的代码完全相同,其中包含单个字符串字段。 但是,跟踪分析工具可以更好地支持基于清单的事件。 此外, MC.exe 为具有单个字符串字段的事件生成的代码比 EventWriteString 函数更高效。
请考虑以下替代方法,而不是使用此 API:
- 使用 TraceLoggingProvider.h 编写 ETW 分析工具非常支持的事件,无需清单即可工作,并包含提供程序名称和事件名称等元数据。
- 编写检测清单。 使用单个 NUL 终止的字符串值创建简单事件。 即使没有清单,也可以编写和收集事件。 只需清单即可解码收集的跟踪。
EventWriteString 写入包含指定字符串的数据有效负载的事件。 此 API 几乎等效于以下代码:
EVENT_DESCRIPTOR eventDescriptor;
EVENT_DATA_DESCRIPTOR dataDescriptor;
EventDescCreate(&eventDescriptor, 0, 0, 0, Level, 0, 0, Keyword);
EventDataDescCreate(&dataDescriptor, String, (wcslen(String) + 1) * sizeof(WCHAR));
return EventWrite(RegHandle, &eventDescriptor, 1, &dataDescriptor);
生成的事件与 EventWrite 生成的任何其他事件相同,只不过生成的事件设置了 EVENT_HEADER_FLAG_STRING_ONLY 标志, (有关) 事件标志的信息,请参阅 EVENT_HEADER 。
请注意,写入事件时,ID、版本、操作码、任务和通道设置为 0。
请注意,事件使用当前线程的活动 ID。
识别 EVENT_HEADER_FLAG_STRING_ONLY 标志的 ETW 分析工具可以提取字符串值,即使解码器找不到事件提供程序的任何其他解码信息。 但是,如果没有清单,工具将无法确定事件的提供程序名称。
要求
最低受支持的客户端 | Windows Vista [桌面应用 | UWP 应用] |
最低受支持的服务器 | Windows Server 2008 [桌面应用 | UWP 应用] |
目标平台 | Windows |
标头 | evntprov.h |
Library | Advapi32.lib |
DLL | Advapi32.dll |