_CrtSetReportHook2, _CrtSetReportHookW2

 

Veröffentlicht: Juli 2016

Die neueste Dokumentation zu Visual Studio 2017 finden Sie unter Dokumentation zu Visual Studio 2017.

Installiert bzw. deinstalliert eine clientdefinierte Berichtsfunktion, indem Berichterstellungsprozess des C-Laufzeit-reporting-Prozess (nur Debugversion).

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

Parameter

mode
Die auszuführende Aktion: _CRT_RPTHOOK_INSTALL oder _CRT_RPTHOOK_REMOVE.

pfnNewHook
Hookfunktion zum Installieren oder entfernen Sie die Narrow-Zeichensatz-Version dieser Funktion.

pfnNewHook
Hookfunktion zum Installieren oder entfernen in der Breitzeichen-Version dieser Funktion.

1, wenn ein Fehler aufgetreten ist, mit EINVAL oder ENOMEM festgelegt; andernfalls gibt den Verweiszähler des pfnNewHook nach dem Aufruf.

_CrtSetReportHook2und _CrtSetReportHookW2 ermöglichen das Einbinden oder lösen eine Funktion, während _CrtSetReportHook können Sie eine Funktion zu verknüpfen.

_CrtSetReportHook2oder _CrtSetReportHookW2 sollte verwendet werden, sondern _CrtSetReportHook dem Hook-Aufruf in eine DLL, und wenn mehrere DLLs geladen werden können und ihre eigenen festlegen Hookfunktionen ausgeführt wird. In einem solchen Fall können DLLs in einer anderen Reihenfolge entladen werden, als sie geladen wurden und die Hookfunktion auf eine DLL entladen belassen werden. Alle Debugausgaben stürzt der Prozess, falls die Hookfunktionen hinzugefügt wurden, mit _CrtSetReportHook.

Alle Hookfunktionen mit hinzugefügt _CrtSetReportHook werden aufgerufen, wenn es kein Hook gibt-Funktionen hinzugefügt, mit _CrtSetReportHook2 oder _CrtSetReportHookW2 oder wenn alle Funktionen mit verknüpfen _CrtSetReportHook2 und _CrtSetReportHookW2 zurückgeben FALSE.

Die Breitzeichen-Version dieser Funktion ist verfügbar. Die Hookfunktionen nehmen eine Zeichenfolge, deren Typ (Breite oder schmale Zeichen) der Version dieser Funktion verwendet entsprechen muss. Verwenden Sie den folgenden Funktionsprototyp für die Berichtsserver-Hooks in der Breitzeichen-Version dieser Funktion verwendet:

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

Verwenden Sie den folgenden Prototyp für die Hooks Narrow-Zeichen-Bericht:

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

Diese Funktionen überprüfen ihre Parameter. Wenn mode oder pfnNewNook ist ungültig, rufen diese Funktionen den Handler für ungültige Parameter, wie in beschrieben Parametervalidierung. Wenn die weitere Ausführung zugelassen wird, stellen diese Funktionen errno auf EINVAL ein und geben -1 zurück.

System_CAPS_ICON_note.jpg Hinweis

Wenn die Anwendung mit /clr kompiliert und die Berichtsfunktion nach dem Beenden der Anwendung "Main" aufgerufen wird, löst die CLR eine Ausnahme aus, wenn die Berichterstellungsfunktion eine CRT-Funktion aufruft.

RoutineErforderlicher HeaderOptionaler Header
_CrtSetReportHook2<crtdbg.h><errno.h>
_CrtSetReportHookW2<crtdbg.h><errno.h>

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

Debugversionen von C-Laufzeitbibliotheken nur.

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

_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  

Debugroutinen

Anzeigen: