_CrtSetReportHook2, _CrtSetReportHookW2

İstemci tanımlı raporlama işlevini C çalışma zamanı hata ayıklama raporlama işlemine bağlayarak yükler veya kaldırır (yalnızca hata ayıklama sürümü).

Sözdizimi

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

Parametreler

mode
Gerçekleştirecek eylem: _CRT_RPTHOOK_INSTALL veya _CRT_RPTHOOK_REMOVE.

pfnNewHook
Bu işlevin dar karakterli veya geniş karakterli sürümünde yüklenecek veya kaldırılacak rapor kancası.

Dönüş değeri

-1 ile veya ENOMEM ayarlanmış bir hatayla EINVAL karşılaşıldıysa; aksi takdirde çağrıdan sonraki başvuru sayısını pfnNewHook döndürür.

Açıklamalar

_CrtSetReportHook2 ve _CrtSetReportHookW2 bir işlevi bağlamanıza veya kancasını kaldırmanıza izin verirken _CrtSetReportHook , yalnızca bir işlevi bağlamanıza olanak tanır.

_CrtSetReportHook2 veya _CrtSetReportHookW2 bir DLL'de kanca çağrısı yapıldığında ve birden çok DLL yüklenebileceği ve kendi kanca işlevlerini ayarlayabileceği durumlarda kullanılmalıdır _CrtSetReportHook . Böyle bir durumda DLL'ler yüklendiklerinden farklı bir sırada kaldırılabilir ve kanca işlevi kaldırılmış DLL'ye işaret ederek bırakılabilir. Kanca işlevleri ile _CrtSetReportHookeklendiyse hata ayıklama çıkışı işlemi kilitler.

ile _CrtSetReportHook eklenen tüm kanca işlevleri, ile _CrtSetReportHook2 eklenen kanca işlevi yoksa veya _CrtSetReportHookW2 ile _CrtSetReportHook2 eklenen ve _CrtSetReportHookW2 döndüren FALSEtüm kanca işlevleri çağrılır.

Bu işlevin geniş karakterli sürümü kullanılabilir. Rapor kancası işlevleri, türü (geniş veya dar karakterler) kullanılan bu işlevin sürümüyle eşleşmesi gereken bir dize alır. Bu işlevin geniş karakterli sürümüyle kullanılan rapor kancaları için aşağıdaki işlev prototipini kullanın:

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

Dar karakterli rapor kancaları için aşağıdaki prototipi kullanın:

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

Bu işlevler parametrelerini doğrular. Veya geçersizsemode, bu işlevler Parametre doğrulama bölümünde açıklandığı gibi geçersiz parametre işleyicisini pfnNewHook çağırır. Yürütmenin devam etmesi için izin verilirse, bu işlevler olarak EINVAL ayarlanır errno ve -1 döndürür.

Not

Uygulamanız /clr ile derlenirse ve uygulama main'dan çıktıktan sonra raporlama işlevi çağrılırsa, raporlama işlevi herhangi bir CRT işlevini çağırırsa CLR bir özel durum oluşturur.

Gereksinimler

Yordam Gerekli başlık İsteğe bağlı üst bilgi
_CrtSetReportHook2 <crtdbg.h> <errno.h>
_CrtSetReportHookW2 <crtdbg.h> <errno.h>

Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.

Kitaplıklar

Yalnızca C çalışma zamanı kitaplıklarının sürümlerinde hata ayıklama.

Örnek

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

Çıktı

_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

Ayrıca bkz.

Hata ayıklama yordamları