Udostępnij za pośrednictwem


_CrtSetReportHook2, _CrtSetReportHookW2

Instaluje lub odinstalowuje funkcja raportowania zdefiniowana przez klienta przez podczepiania go do debugowania run-time C, zgłoszenie procesu (tylko wersja debugowania).

int _CrtSetReportHook2( 
   int mode, 
   _CRT_REPORT_HOOK pfnNewHook 
); 
int _CrtSetReportHookW2( 
   int mode, 
   _CRT_REPORT_HOOKW pfnNewHook 
);

Parametry

  • mode
    Akcja: _CRT_RPTHOOK_INSTALL lub _CRT_RPTHOOK_REMOVE.

  • pfnNewHook
    Hak raportu do zainstalowania lub usunięcia w wersji znaków wąskim tej funkcji.

  • pfnNewHook
    Hak raportu do zainstalowania lub usunięcia w wersji szerokich znaków z tej funkcji.

Wartość zwracana

-1, jeśli wystąpił błąd z EINVAL lub ENOMEM Ustaw; w przeciwnym razie zwraca liczbę odwołań z pfnNewHook po wywołaniu.

Uwagi

_CrtSetReportHook2i _CrtSetReportHookW2 umożliwiają hook lub odpięcie funkcji, należy _CrtSetReportHook tylko umożliwia spinanie funkcji.

_CrtSetReportHook2lub _CrtSetReportHookW2 powinny być używane zamiast _CrtSetReportHook kiedy hak wywołanie biblioteki DLL i kiedy wiele bibliotek DLL może być załadowany i ustawienie ich własnych hook funkcji.W takiej sytuacji biblioteki DLL można być rozładowywane w innej kolejności niż zostały załadowane i funkcja hak można pozostawić naprzeciwko rozładowane biblioteki DLL.Dowolne dane wyjściowe debugowania awarii procesu, jeśli dodano funkcje haka z _CrtSetReportHook.

Dowolne hook funkcje dodane z _CrtSetReportHook są nazywane, jeśli nie istnieją żadne hook funkcje dodane z _CrtSetReportHook2 lub _CrtSetReportHookW2 lub jeśli hook wszystkie funkcje dodane z _CrtSetReportHook2 i _CrtSetReportHookW2 zwrotu FALSE.

Wersja szerokich znaków ta funkcja jest dostępna.Funkcje hook raport podjąć ciąg, którego typ (znaki szerokie lub wąskie) musi być zgodna wersja tej funkcji używane.Użyj następujących prototyp funkcji dla haki raport używany z wersją szerokich znaków tej funkcji:

int YourReportHook( int reportType, wchar_t *message, int *returnValue );

Użyć następujący prototyp haki znak wąskim raportu:

int YourReportHook( int reportType, char *message, int *returnValue );

Te funkcje sprawdzania poprawności ich parametrów.Jeśli mode lub pfnNewNook jest nieprawidłowy, te funkcje wywołania obsługi nieprawidłowy parametr, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie może kontynuować, ustaw te funkcje errno do EINVAL i zwraca –1.

[!UWAGA]

Jeśli aplikacja została skompilowana z /clr i raportowania funkcja jest wywoływana po aplikacji został zakończony główne, środowisko CLR wygeneruje wyjątek funkcja raportowania wywołuje żadnych funkcji CRT.

Wymagania

Rozpoczęto wykonywanie procedury

Wymaganego nagłówka

Opcjonalne nagłówka

_CrtSetReportHook2

<crtdbg.h>

<errno.h>

_CrtSetReportHookW2

<crtdbg.h>

<errno.h>

Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.

Biblioteki

Debug wersje biblioteki uruchomieniowej c tylko.

Przykład

// 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;
}

Dane wyjściowe

_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

Zobacz też

Informacje

Procedury debugowania