Compartir a través de


¿Puedo conservar el último código de error antes de llamar a TraceMessage?

De forma predeterminada, se llama a TraceMessage mediante la macro WPP_TRACE. En versiones de Windows anteriores a Windows Vista, TraceMessage sobrescribía el último código de error.

A partir de Windows Vista, puedes conservar el código de último error definiendo una macro de WPP_TRACE personalizada. Debe definir la versión de esta macro antes de incluir el archivo de encabezado de mensaje de seguimiento (.tmh) en el archivo de origen del proveedor de seguimiento, como un controlador en modo kernel o una aplicación en modo de usuario.

En los ejemplos siguientes se muestra cómo conservar el código de último error antes de llamar a TraceMessage:

  • Cree un contenedor en TraceMessage al que se llama desde la macro WPP_TRACE. A continuación, puede llamar a TraceMessageVa desde la función contenedora.

    En el ejemplo siguiente se muestra cómo escribir un contenedor en TraceMessage:

    #define WPP_TRACE WppTraceMessageWrapper
    DWORD
    WppTraceMessageWrapper(
        __in TRACEHANDLE LoggerHandle,
        __in ULONG MessageFlags,
        __in LPCGUID MessageGuid,
        __in USHORT Message Number,
        ...)
    {
        DWORD TraceError = ERROR_SUCCESS;
        DWORD LastError = ERROR_SUCCESS;
        va_list Args = NULL;
    
        LastError = GetLastError();
    
        va_start(Args, Message Number);
        TraceError = TraceMessageVa(LoggerHandle, MessageFlags, MessageGuid, Message Number, Args);
        va_end(Args);
    
        SetLastError(LastError);
     return TraceError;
    }
    
  • Modifique la macro WPP_TRACE, como se muestra en el ejemplo siguiente:

    #define WPP_TRACE(...)                              \
     do                                              \
        {                                               \
            DWORD LastError = GetLastError();           \
            TraceMessage(__VA_ARGS__);                  \
            SetLastError(LastError);                    \
        }                                               \
     while (FALSE, FALSE)
    

    Nota Este método aumenta el tamaño de código de los archivos binarios porque se generará el mismo código para cada función WPP_SF.