Posso preservar o código de último erro antes que TraceMessage seja chamado?
Por padrão, TraceMessage é chamado usando a macro WPP_TRACE. Em versões do Windows anteriores ao Windows Vista, o código de último erro foi substituído por TraceMessage.
A partir do Windows Vista, você pode preservar o código de último erro definindo uma macro de WPP_TRACE personalizada. Você deve definir sua versão dessa macro antes de incluir o arquivo de cabeçalho de mensagem de rastreamento (.tmh) no arquivo de origem do provedor de rastreamento, como um driver do modo kernel ou um aplicativo de modo de usuário.
Os exemplos a seguir mostram como você pode preservar o código de último erro antes de chamar TraceMessage:
Faça um wrapper para TraceMessage que é chamado da macro WPP_TRACE. Em seguida, você pode chamar TraceMessageVa, da função wrapper.
O exemplo a seguir mostra como gravar um wrapper no 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 a macro WPP_TRACE, conforme mostrado no exemplo a seguir:
#define WPP_TRACE(...) \ do \ { \ DWORD LastError = GetLastError(); \ TraceMessage(__VA_ARGS__); \ SetLastError(LastError); \ } \ while (FALSE, FALSE)
Nota Esse método aumenta o tamanho do código dos arquivos binários porque o mesmo código será gerado para cada função WPP_SF.