_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 и функциональность отчетов вызывается после того, как приложение покидает main, среда 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