Share via


_CrtSetReportHook2, _CrtSetReportHookW2

Installiert oder deinstalliert eine clientdefinierte Berichtsfunktion indem das Haken in den Prozess der C-Laufzeit - Debuggen von Berichten (nur Debugversion).

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

Parameter

  • mode
    Die Aktion, die ausgeführt werden soll: _CRT_RPTHOOK_INSTALL oder _CRT_RPTHOOK_REMOVE.

  • pfnNewHook
    In der Enge Zeichen Version dieser Funktion zu installieren oder zu entfernen, hook Berichts.

  • pfnNewHook
    In einer Breitzeichen-Version dieser Funktion zu installieren oder zu entfernen, hook Berichts.

Rückgabewert

-1, wenn ein Fehler aufgetreten ist, mit EINVAL oder legen Sie ENOMEM fest. Andernfalls wird der Verweiszähler der pfnNewHook nach dem Aufruf zurück.

Hinweise

_CrtSetReportHook2 und verknüpfen Sie können _CrtSetReportHookW2oder heben eine Funktion Verknüpfung auf, während _CrtSetReportHook verknüpfen Sie nur eine Funktion können.

_CrtSetReportHook2 oder _CrtSetReportHookW2sollten anstelle _CrtSetReportHook Hookfunktion verwendet werden, wenn der Aufruf erfolgt in einer DLL, als mehrere DLLs Festlegen und geladen werden und ihre eigenen Hookfunktionen.In einer solchen Situation kann DLLs in einer anderen Reihenfolge als entladen werden sie geladen wurden und die Hookfunktion an einem genommenen DLL entladen, zeigen gelassen werden kann.Alle debuggen abstürze Ausgabe des Prozesses, wenn die Hookfunktionen mit _CrtSetReportHookhinzugefügt wurden.

Alle Hookfunktionen, die mit _CrtSetReportHook hinzugefügt werden, werden aufgerufen, wenn keine vorhanden sind, die mit _CrtSetReportHook2 Hookfunktionen hinzugefügt oder _CrtSetReportHookW2oder wenn alle Hookfunktionen, die mit _CrtSetReportHook2 und _CrtSetReportHookW2hinzugefügt werden, FALSEzurückgeben.

Die Breitzeichen-Version dieser Funktion ist verfügbar.Die Berichts hookfunktionen nehmen eine Zeichenfolge, deren Typ (schmale Zeichen) oder breit die Version der verwendeten Funktion übereinstimmen muss.Verwenden Sie den folgenden hooks Funktionsprototyp für die Berichtsansicht der Breitzeichen-Version dieser Funktion verwendet werden:

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

Verwenden Sie den folgenden Prototypen für die Enge Zeichen Berichts hooks:

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

Diese Funktionen überprüfen deren Parameter.Wenn mode oder pfnNewNook nicht gültig ist, rufen diese Funktionen der ungültige Parameter für ein, wie in Parametervalidierungbeschrieben.Wenn die Ausführung fortgesetzt werden kann, darf dieses Features zu EINVAL und legen errno return -1.

HinweisHinweis

Wenn die Anwendung mit /clr kompiliert und die Berichtsfunktion aufgerufen wird, nachdem die Anwendung main abgeschlossen ist, löst die CLR eine Ausnahme aus, wenn die Berichten funktionsaufrufe entweder CRT-Funktionen.

Anforderungen

Routine

Erforderlicher Header

Optionaler Header

_CrtSetReportHook2

<crtdbg.h>

<errno.h>

_CrtSetReportHookW2

<crtdbg.h>

<errno.h>

Weitere Informationen finden Sie unter Kompatibilität Kompatibilität in der Einführung.

Bibliotheken

Debugversionen von nur C .

Beispiel

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

Siehe auch

Referenz

Debug- Routinen