次の方法で共有


TraceMessage が呼び出される前の最後のエラー コードを保持できますか?

既定では、 TraceMessage は WPP_TRACE マクロを使用して呼び出されます。 Windows Vista より前のバージョンの Windows では、最後の エラー コードTraceMessage によって上書きされました。

Windows Vista 以降では、カスタム WPP_TRACE マクロを定義することで、最後のエラー コードを保持できます。 トレース プロバイダーのソース ファイル (カーネル モード ドライバーやユーザー モード アプリケーションなど) にトレース メッセージ ヘッダー (.tmh) ファイルを含める前に、このマクロのバージョンを定義する必要があります。

次の例は、 TraceMessage を呼び出す前に最後のエラー コードを保持する方法を示しています。

  • WPP_TRACE マクロから呼び出される TraceMessage のラッパーを作成します。 その後、ラッパー関数から TraceMessageVa を呼び出すことができます。

    次の例は、 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;
    }
    
  • 次の例に示すように、WPP_TRACE マクロを変更します。

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

    手記 このメソッドは、各WPP_SF関数に対して同じコードが生成されるため、バイナリ ファイルのコード サイズを増やします。