次の方法で共有


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 関数ごとに同じコードが生成されるため、バイナリ ファイルのコード サイズが増加します。