首页 > 解决方案 > 访问与使用 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() 访问与事件关联的用户数据,如此处的文档中所示,但是如果变量 buffersize 初始化为 0,则函数 TdhGetEventInformation() 失败并出现 ERROR_NOT_FOUND 并且如果 buffersize 初始化为 a 则失败并出现错误 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);
    }
}

标签: c++windowsmsdnetw

解决方案


推荐阅读