다음을 통해 공유


_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을 EINVAL 또는 ENOMEM 로 설정 합니다. 그렇지 않은 경우 참조 개수를 반환 합니다. 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 및 응용 프로그램이 종료 된 후 보고 함수 주 라고, 보고 함수는 CRT 함수를 호출 하면 CLR은 예외를 throw 합니다.

요구 사항

루틴

필수 헤더

선택적 헤더

_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

참고 항목

참조

루틴을 디버깅 합니다.