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 rapport de débogage runtime C (version debug uniquement).

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

Paramètres

  • mode
    L'action à effectuer : _CRT_RPTHOOK_INSTALL ou _CRT_RPTHOOK_REMOVE.

  • pfnNewHook
    enregistrez le raccordement pour installer ou supprimer dans la version d'étroit-personnage de cette fonction.

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

Valeur de retour

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

Notes

_CrtSetReportHook2 et _CrtSetReportHookW2vous permettent de connecter ou décrocher une fonction, alors que _CrtSetReportHook vous autorise uniquement raccorder une fonction.

_CrtSetReportHook2 ou _CrtSetReportHookW2doit être utilisé au lieu d' _CrtSetReportHook lorsque l'appel de raccordement s'effectue dans une DLL et lorsque les plusieurs DLL peuvent être chargés et exemple leurs propres fonctions de raccordement.Dans ce cas, les DLL peuvent être déchargés dans un ordre différent de celui dans lequel ils ont été chargés et la fonction de raccordement peut rester pointant vers une DLL déchargé.Toute sortie de débogage s'arrête le processus si les fonctions de raccordement était ajoutée à _CrtSetReportHook.

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

La version à caractère élargi de cette fonction est disponible.Les fonctions de raccordement de rapport acceptant une chaîne dont le type (caractères ou étroits) doit correspondre à la version de cette fonction utilisée.Utilisez le prototype de fonction suivant pour les connexions d'état utilisés avec la version à caractère élargi de cette fonction :

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

Utilisez le prototype suivant pour les connexions d'état d'étroit-personnage :

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

ces fonctions valident leurs paramètres.si mode ou pfnNewNook est valide, ces fonctions appellent le gestionnaire de paramètre non valide, comme décrit dans Validation des paramètres.Si est autorisé à l'exécution de se poursuivre, ces errno défini par fonctions à EINVAL et à retourner -1.

[!REMARQUE]

Si votre application est compilée avec /clr et une fonctionnalité de création de rapports est appelée après que l'application soit arrêtée main, le CLR lèvera une exception si les appels de fonctions de création de rapports que tout fonctions 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 de compatibilité, consultez compatibilité dans l'introduction.

bibliothèques

Versions debug de Bibliothèques runtime C uniquement.

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

Déboguez des routines