Partager via


_CrtSetReportHook2, _CrtSetReportHookW2

Installe ou désinstalle une fonction de rapport définie par le client en l'accrochant dans le processus de création de débogage du runtime C (version Debug uniquement).

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

Paramètres

  • mode
    Action à effectuer :_CRT_RPTHOOK_INSTALL or _CRT_RPTHOOK_REMOVE.

  • pfnNewHook
    Enregistrez le raccordement pour installer ou supprimer dans la version de étroit- caractère de cette fonction.

  • pfnNewHook
    Enregistrez le raccordement pour installer ou supprimer dans la version de étroit- caractère de cette fonction.

Valeur de retour

-1 si une erreur est rencontrée, avec EINVAL ou ENOMEM définissez ; sinon retourne le nombre de références d'pfnNewHook après l'appel.

Notes

_CrtSetReportHook2 et _CrtSetReportHookW2 vous permettent de décrocher accrocher ou une fonction, alors qu' _CrtSetReportHook vous permet uniquement accrocher une fonction.

_CrtSetReportHook2 ou _CrtSetReportHookW2 doit être utilisé au lieu _CrtSetReportHook l'appel de raccordement s'effectue dans une DLL et lorsque les DLL multiples peuvent être chargés et définissants leurs propres fonctions de raccordement. Dans ce type de situation, les DLL peuvent être déchargé dans un ordre différent qu'ils ont été chargés et la fonction de raccordement peut pas être modifiée le curseur dans une DLL déchargé. Toute sortie de débogage se bloque le processus si les fonctions de raccordement ont été ajoutées à _CrtSetReportHook.

Toutes les fonctions de raccordement ajoutées à _CrtSetReportHook sont appelées s'il n'existe aucune fonction de raccordement ajoutée à _CrtSetReportHook2 ou _CrtSetReportHookW2 ou si toutes les fonctions de raccordement ajoutées à _CrtSetReportHook2 et _CrtSetReportHookW2 retournent FALSE.

La version de caractères larges de cette fonction est disponible. Les fonctions de raccordement de rapport prennent une chaîne de type (caractères larges ou étroits) doit correspondre à la version de cette fonction. Utilisez le prototype de la fonction suivant pour les raccordements de rapport utilisés avec la version de caractères larges de cette fonctionnalité :

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

Utilisez le prototype suivant pour les raccordements de rapport d'étroit- caractère :

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

Ces fonctions valident leurs paramètres. Si mode ou pfnNewNook est invalide, ces fonctions appellent le gestionnaire de paramètres non valides, comme décrit dans Validation de paramètre. Si l'exécution est autorisée à se poursuivre, ces fonctions définissent errno avec la valeur EINVAL et retournent -1.

Notes

Si votre application est compilée avec /clr et la fonction de rapport est appelée après que l'application ai arrêté Main, le CLR lève une exception si les fonction de rapport appellent n'importe quelle fonction CRT.

Configuration requise

Routine

En-tête requis

En-tête facultatif

_CrtSetReportHook2

<crtdbg.h>

<errno.h>

_CrtSetReportHookW2

<crtdbg.h>

<errno.h>

Pour plus d'informations sur la compatibilité, consultez Compatibilité dans l'introduction.

Bibliothèques

Seulement les versions debug des bibliothèques Runtime C.

Exemple

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

Sortie

_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

Voir aussi

Référence

Routines de débogage