_CrtSetReportHook2、_CrtSetReportHookW2

インストールまたはアンマネージ インストール C ランタイムのデバッグ レポートのプロセス (デバッグ バージョンだけ) にフックすることによりクライアント定義のレポート関数。

int _CrtSetReportHook2(
   int mode,
   _CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
   int mode,
   _CRT_REPORT_HOOKW pfnNewHook
);

パラメーター

  • mode
    : 行う操作 _CRT_RPTHOOK_INSTALL または _CRT_RPTHOOK_REMOVE

  • pfnNewHook
    この関数が狭文字のバージョンのインストールまたは削除するためにフックを報告します。

  • pfnNewHook
    この関数のワイド文字バージョンでインストールまたは削除するためにフックを報告します。

戻り値

エラーが見つけられたら -1または EINVALENOMEM の設定と ; はの呼び出し後に pfnNewHook の参照カウントを返します。

解説

_CrtSetReportHook のみが関数を呼び出した場合に使用します。_CrtSetReportHook2_CrtSetReportHookW2 は関数を呼び出した場合または外すことができます。

_CrtSetReportHook2 または _CrtSetReportHookW2_CrtSetReportHook の代わりに使用することでフック関数の呼び出しが DLL で行われると複数の DLL の場合に読み込まれ独自のフック関数であるを設定します。このような場合DLL は異なる順序で読み込まれフック関数がアンロードされた DLL のポインターを保持できるアンロードできます。フック関数は _CrtSetReportHook に追加されたすべてのデバッグ出力はプロセスがクラッシュします。

_CrtSetReportHook2 または _CrtSetReportHookW2 に追加するフック関数がないか**_CrtSetReportHook2** と _CrtSetReportHookW2 に追加されたすべてのフック関数は FALSE を返します _CrtSetReportHook に追加するフック関数が呼び出されます。

この関数のワイド文字バージョンを使用できます。レポート用のフック関数は全角文字型 (または) を使用したこの関数のバージョンに一致する必要がある文字列を取得します。この関数のワイド文字バージョンで使用されるレポート用のフックには次の関数プロトタイプの使用 :

int YourReportHook( int reportType, wchar_t *message, int *returnValue );

狭文字のレポート用のフックには次のプロトタイプの使用 :

int YourReportHook( int reportType, char *message, int *returnValue );

これらの関数では、パラメーターの検証が行われます。mode または pfnNewNook はこれらの関数は パラメーターの検証 に説明されているように無効なパラメーター ハンドラーを呼び出します。実行の継続が許可された場合、これらの関数は errno を EINVAL に設定し、-1 を返します。

[!メモ]

アプリケーションがメインが終了した後にアプリケーションが /clr およびレポート関数を呼び出すとCLR はレポート関数が CRT 関数を呼び出すと例外がスローされます。

必要条件

ルーチン

必須ヘッダー

オプション ヘッダー

_CrtSetReportHook2

<crtdbg.h>

<errno.h>

_CrtSetReportHookW2

<crtdbg.h>

<errno.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

ライブラリ

C ランタイム ライブラリのデバッグ バージョンのみ。

使用例

// crt_setreporthook2.c
#include <windows.h>
#include <stdio.h>
#include <crtdbg.h>
#include <assert.h>

int __cdecl TestHook1(int nReportType, char* szMsg, int* pnRet)
{
   int nRet = FALSE;

   printf("CRT report hook 1.\n");
   printf("CRT report type is \"");
   switch (nReportType)
   {
      case _CRT_ASSERT:
      {
         printf("_CRT_ASSERT");
         // nRet = TRUE;   // Always stop for this type of report
         break;
      }

      case _CRT_WARN:
      {
         printf("_CRT_WARN");
         break;
      }

      case _CRT_ERROR:
      {
         printf("_CRT_ERROR");
         break;
      }

      default:
      {
         printf("???Unknown???");
         break;
      }
   }

   printf("\".\nCRT report message is:\n\t");
   printf(szMsg);

   if   (pnRet)
      *pnRet = 0;

   return   nRet;
}

int __cdecl   TestHook2(int nReportType, char* szMsg, int* pnRet)
{
   int   nRet = FALSE;

   printf("CRT report hook 2.\n");
   printf("CRT report type is \"");
   switch   (nReportType)
   {
      case _CRT_WARN:
      {
         printf("_CRT_WARN");
         break;
      }

      case _CRT_ERROR:
      {
         printf("_CRT_ERROR");
         break;
      }

      case _CRT_ASSERT:
      {
         printf("_CRT_ASSERT");
         nRet = TRUE;   // Always stop for this type of report
         break;
      }

      default:
      {
         printf("???Unknown???");
         break;
      }
   }

   printf("\".\nCRT report message is: \t");
   printf(szMsg);

   if   (pnRet)
      *pnRet = 0;
   // printf("CRT report code is %d.\n", *pnRet);
   return   nRet;
}

int   main(int argc, char* argv[])
{
   int   nRet = 0;

   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1)"
          " returned %d\n", nRet);

   _ASSERT(0);

   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2)"
          " returned %d\n", nRet);
   nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1);
   printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1)"
          " returned %d\n", nRet);

   return   nRet;
}

出力

_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2) returned 0
_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1) returned 0

参照

関連項目

デバッグ ルーチン