访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
Access user data associated with event provided using TraceLoggingWrite
我能够使用此方法从我的应用程序生成跟踪日志记录事件(能够在Windows性能分析器中查看它们(。 发出的事件如下
HRESULT CTracelogger::PublishEvent(void *pData)
{
if (pData)
{
EVENT_H sHEvent = *(static_cast<EVENT_H *>(pData));
TraceLoggingWrite(g_hEventProvider,
"HEvent",
TraceLoggingStruct(5, "HEventData"),
TraceLoggingUInt32(sHEvent.m_eEventType, "eEventType"),
TraceLoggingUInt32(sHEvent.m_uiVersion, "Version"),
TraceLoggingUInt32(sHEvent.m_uiPid, "Pid"),
TraceLoggingUInt32(sHEvent.m_uiSize, "Size"),
TraceLoggingWideString(sHEvent.m_wszHName, "HName")
);
}
return S_OK;
}
我正在尝试通过编写自定义使用者在不同的应用程序中使用相同的事件,使用者正在接收事件(因为正在接收相应的提供程序 GUID 事件(。我正在尝试使用 TdhGetProperty(( 访问与事件关联的用户数据,如此处的文档所示,但如果变量缓冲区大小初始化为 0,函数 TdhGetEventInformation(( 失败并ERROR_NOT_FOUND,如果缓冲区大小初始化为非零值,则失败并显示错误ERROR_INVALID_PARAMETER。
采用上述方法来检索与跟踪日志记录事件关联的数据是否正确? 如果是,那么为什么 TdhGetEventInformation(( 失败了?
VOID WINAPI CEventLogger::EventRecordCallback(PEVENT_RECORD pEvent)
{
DWORD status = ERROR_SUCCESS;
PTRACE_EVENT_INFO pInfo = NULL;
char msgbuf[4096];
DWORD BufferSize = 0;
status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
if (ERROR_INSUFFICIENT_BUFFER == status)
{
pInfo = (TRACE_EVENT_INFO*)malloc(BufferSize);
if (pInfo == NULL)
{
OutputDebugString("Failed to allocate memory for event info");
status = ERROR_OUTOFMEMORY;
return;
}
else
{
OutputDebugString("successful memory allocation");
}
// Retrieve the event metadata.
status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
}
if (ERROR_SUCCESS != status)
{
sprintf_s(msgbuf, "TdhGetEventInformation failed status[%d], buffersize[%d]", status, BufferSize);
OutputDebugString(msgbuf);
}
else
{
sprintf_s(msgbuf, "TdhGetEventInformation successful, buffersize[%d]", BufferSize);
OutputDebugString(msgbuf);
}
}
上面的代码看起来很合理。我的猜测是问题出在您调用OpenTrace上。默认情况下(为了向后兼容非常旧的代码(,OpenTrace 假定您的回调想要接收EVENT_TRACE
结构。但是,您的回调希望收到EVENT_RECORD
。要告诉 OpenTrace 使用较新的EVENT_RECORD
格式,您必须将ProcessTraceMode
设置为PROCESS_TRACE_MODE_EVENT_RECORD
。
相关文章:
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 关联容器的下界复杂性:成员函数与非成员函数
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 给定顺序中的事件处理
- std::future_error:无关联状态
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何创建事件驱动的 SDL2 应用程序
- 查找自动生成键并具有线性内存消耗的小型关联数组
- Windows 进程间同步类似事件?
- 如何从C++端挂接到 QML 项的 onClick 事件
- 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
- 将 ETW 文件对象与 DiskIO 事件相关联