_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