Partager via


Puis-je conserver le code de la dernière erreur avant l’appel de TraceMessage ?

Par défaut, TraceMessage est appelé à l’aide de la macro WPP_TRACE. Dans les versions de Windows antérieures à Windows Vista, le code de la dernière erreur a été remplacé par TraceMessage.

À partir de Windows Vista, vous pouvez conserver le code de la dernière erreur en définissant une macro WPP_TRACE personnalisée. Vous devez définir votre version de cette macro avant d’inclure le fichier d’en-tête de message de trace (.tmh) dans le fichier source de votre fournisseur de trace, par exemple un pilote en mode noyau ou une application en mode utilisateur.

Les exemples suivants montrent comment conserver le code de la dernière erreur avant d’appeler TraceMessage :

  • Créez un wrapper pour TraceMessage appelé à partir de la macro WPP_TRACE. Vous pouvez ensuite appeler TraceMessageVa, à partir de la fonction wrapper.

    L’exemple suivant montre comment écrire un wrapper dans 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;
    }
    
  • Modifiez la macro WPP_TRACE, comme illustré dans l’exemple suivant :

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

    Note Cette méthode augmente la taille du code de vos fichiers binaires, car le même code sera généré pour chaque fonction WPP_SF.