Поделиться через


_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

См. также

Ссылки

Подпрограммы отладка