Sdílet prostřednictvím


_CrtSetReportHook2, _CrtSetReportHookW2

Nainstaluje nebo odinstaluje funkci generování sestav definovanou klientem tak, že ji připojíte k procesu generování sestav ladění za běhu jazyka C (pouze ladicí verze).

Syntaxe

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

Parametry

mode
Akce, která se má provést: _CRT_RPTHOOK_INSTALL nebo _CRT_RPTHOOK_REMOVE.

pfnNewHook
Volání sestavy pro instalaci nebo odebrání ve verzi této funkce s úzkým znakem nebo širokým znakem

Vrácená hodnota

-1, pokud byla zjištěna chyba s EINVAL nebo ENOMEM nastavenou chybou; v opačném případě vrátí počet pfnNewHook odkazů za voláním.

Poznámky

_CrtSetReportHook2 a _CrtSetReportHookW2 nechte funkci zaháčkovat nebo odblokovat, zatímco _CrtSetReportHook funkci můžete zaháčkovat pouze.

_CrtSetReportHook2 nebo _CrtSetReportHookW2 by se měla použít místo _CrtSetReportHook při volání hooku v knihovně DLL a kdy může být načteno více knihoven DLL a nastavení jejich vlastních funkcí háku. V takové situaci lze knihovny DLL uvolnit v jiném pořadí, než byly načteny, a funkce háku může zůstat nasměrovaná na uvolněnou knihovnu DLL. Jakýkoli výstup ladění chybově ukončí proces, pokud byly přidány funkce háku s _CrtSetReportHook.

Všechny funkce háku přidané pomocí _CrtSetReportHook se volají, pokud nejsou přidány _CrtSetReportHook2 žádné funkce háku nebo _CrtSetReportHookW2 pokud všechny funkce háku přidané s _CrtSetReportHook2 a _CrtSetReportHookW2 vrácení FALSE.

K dispozici je široká verze této funkce. Funkce háku sestavy přebírají řetězec, jehož typ (široké nebo úzké znaky) musí odpovídat použité verzi této funkce. Pro háky sestavy používané s širokoznakovou verzí této funkce použijte následující prototyp funkce:

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

Pro háky sestav s úzkými znaky použijte následující prototyp:

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

Tyto funkce ověřují své parametry. Pokud mode jsou nebo pfnNewHook jsou neplatné, tyto funkce vyvolávají neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru. Pokud je spuštění povoleno pokračovat, tyto funkce jsou nastavené errno na EINVAL hodnotu -1 a vrátí hodnotu -1.

Poznámka:

Pokud je vaše aplikace zkompilována pomocí /clr a funkce generování sestav je volána po ukončení hlavní aplikace, CLR vyvolá výjimku, pokud funkce generování sestav volá některé funkce CRT.

Požadavky

Rutina Požadovaný hlavičkový soubor Volitelné záhlaví
_CrtSetReportHook2 <crtdbg.h> <errno.h>
_CrtSetReportHookW2 <crtdbg.h> <errno.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Knihovny

Ladění pouze verzí knihoven runtime jazyka C.

Příklad

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

Výstup

_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

Viz také

Rutiny ladění