_CrtSetReportHook2, _CrtSetReportHookW2
Задает или удаляет клиент-определенная функции отчетности путем ее выполнение среды выполнения c отчетов процесс отладки (отладочные версии).
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Параметры
mode
Действие: _CRT_RPTHOOK_INSTALL OR _CRT_RPTHOOK_REMOVE.pfnNewHook
Информируйте обработчик для установки или удаления в версии узк-знака этой функции.pfnNewHook
Информируйте обработчик для установки или удаления в версии расширенных символов этой функции.
Возвращаемое значение
-1, если обнаружена ошибка, и EINVAL OR ENOMEM набор; в противном случае возвращает значение счетчика ссылок pfnNewHook после вызова.
Заметки
_CrtSetReportHook2 и _CrtSetReportHookW2предоставьте обработчик расцепляйте или функцию, тогда как _CrtSetReportHook только позволяет обработчику функция.
_CrtSetReportHook2 OR _CrtSetReportHookW2следует использовать вместо _CrtSetReportHook при вызове обработчика будет в DLL, когда несколько библиотек DLL могут быть загружены и устанавливаются собственные функции обработчика.В такой ситуации библиотека DLL может быть выгружен в другом порядке, чем они были загружены и функция обработчика может остаться указывать на расгруженном библиотеки DLL.Любые сбои процесс отладки вывода если функции обработчика были добавлены с _CrtSetReportHook.
Все функции, добавленные с помощью обработчика _CrtSetReportHook вызовите при отсутствии функции обработчика, добавленные с _CrtSetReportHook2 OR _CrtSetReportHookW2или, если все функции обработчика, добавленные после _CrtSetReportHook2 и _CrtSetReportHookW2return FALSE.
Версия расширенных символов этой функции доступен.Функции обработчика отчетов принимает строку, тип которой (широким или узким символам) соответствовать версии, используемой этой функции.Используйте следующий прототип функции для обработчиков отчета, используемых с версией расширенных символов этой функции.
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Используйте следующий прототип для обработчиков отчете о узк-знака:
int YourReportHook( int reportType, char *message, int *returnValue );
Эти функции проверяют их параметры.If mode OR 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