È possibile conservare l'ultimo codice di errore prima della chiamata a TraceMessage?
Per impostazione predefinita, TraceMessage viene chiamato usando la macro WPP_TRACE. Nelle versioni di Windows precedenti a Windows Vista, il codice dell'ultimo errore è stato sovrascritto da TraceMessage.
A partire da Windows Vista, è possibile mantenere il codice dell'ultimo errore definendo una macro personalizzata WPP_TRACE. È necessario definire la versione di questa macro prima di includere il file di intestazione del messaggio di traccia (.tmh) nel file di origine del provider di traccia, ad esempio un driver in modalità kernel o un'applicazione in modalità utente.
Gli esempi seguenti illustrano come conservare il codice di ultimo errore prima di chiamare TraceMessage:
Creare un wrapper in TraceMessage chiamato dalla macro WPP_TRACE. È quindi possibile chiamare TraceMessageVa dalla funzione wrapper.
Nell'esempio seguente viene illustrato come scrivere un wrapper in 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; }
Modificare la macro WPP_TRACE, come illustrato nell'esempio seguente:
#define WPP_TRACE(...) \ do \ { \ DWORD LastError = GetLastError(); \ TraceMessage(__VA_ARGS__); \ SetLastError(LastError); \ } \ while (FALSE, FALSE)
Nota Questo metodo aumenta le dimensioni del codice dei file binari perché lo stesso codice verrà generato per ogni funzione WPP_SF.