共用方式為


_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呼叫後。

備註

_CrtSetReportHook2與**_CrtSetReportHookW2** 可讓您將連結,或攔截函式,而 _CrtSetReportHook 只能讓您攔截函式。

_CrtSetReportHook2或**_CrtSetReportHookW2** 應該用來代替**_CrtSetReportHook時攔截程序發出呼叫的 DLL,並可能載入多個 Dll,並設定他們自己攔截函式。 在這種情況下,Dll 可以卸載以不同方式比已載入而且可保留攔截函式,對準卸載 DLL。 如果攔截函式所加入的處理序當機的任何偵錯輸出_CrtSetReportHook**。

任何攔截與加入的函式**_CrtSetReportHook函式加入有沒有攔截程序時,會呼叫_CrtSetReportHook2_CrtSetReportHookW2** ,否則所有攔截與加入的函式**_CrtSetReportHook2_CrtSetReportHookW2** 傳回FALSE

使用這個函式的寬字元版本。 報告攔截函式採用 (寬或較窄字元) 的型別必須符合的版本,使用這個函式的字串。 報告攔截函式之這個函式的寬字元版本搭配使用,請使用下列的函式原型:

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 執行階段程式庫只。

範例

// 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;
}

Output

_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

請參閱

參考

偵錯常式