_CrtSetReportHook2, _CrtSetReportHookW2

Yükler veya istemci tanımlı raporlama işlevi raporlama işlemi (yalnızca hata ayıklama sürümü) c çalışma zamanı hata ayıklama takma kaldırır.

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

Parametreler

  • mode
    Yapılacak eylem: _CRT_RPTHOOK_INSTALL veya _CRT_RPTHOOK_REMOVE.

  • pfnNewHook
    Kanca yüklemek veya bu işlev karakter uzunluğundaki dar sürümünü kaldırmak bildirin.

  • pfnNewHook
    Kanca yüklemek veya bu işlevi geniş karakter sürümünü kaldırmak bildirin.

Dönüş Değeri

bir hatayla karşılaşıldı, -1 ile EINVAL veya ENOMEM olarak ayarlayın; Aksi takdirde başvuru sayısını döndürür pfnNewHook çağrısının.

Notlar

_CrtSetReportHook2ve _CrtSetReportHookW2 kanca veya bir işlev unhook iken izin _CrtSetReportHook yalnızca bir işlev kanca sağlar.

_CrtSetReportHook2veya _CrtSetReportHookW2 yerine kullanılması gereken _CrtSetReportHook ne zaman kanca çağrısı yapılan bir dll ve ne zaman birden fazla dll yüklendi ve kanca İşlevler, kendi ayarlama.Böyle bir durumda, dll dosyaları farklı bir sırayla yüklendikleri ve kanca işlevi sırasında yüklenmemiş bir DLL'ın üzerine gelerek bırakılabilir kaldırıldı.Kanca işlevler ile eklenmiş, işlemin herhangi bir hata ayıklama çıkışı çöküyor _CrtSetReportHook.

Herhangi bir kanca işlev ile eklenen _CrtSetReportHook hiçbir kanca işlevlerinin eklenmesi ile varsa adlı _CrtSetReportHook2 veya _CrtSetReportHookW2 veya tüm işlevleri ile eklenen kanca, _CrtSetReportHook2 ve _CrtSetReportHookW2 dönmek FALSE.

Bu işlev geniş karakter sürümü kullanılabilir.Bir dize (karakter geniş veya dar) türü kullanılan bu işlev sürümü eşleşmelidir rapor kanca işlevler gerçekleştirin.Bu işlev geniş karakter sürümünde kullanılan rapor kancaları için işlev prototipi aþaðýdaki kullanın:

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

Aşağıdaki prototipe dar karakter rapor kancaları için kullanın:

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

Bu işlevler, kendi parametreleri doğrulayın.mode Veya pfnNewNook olan geçersiz, bu işlevler geçersiz parametre işleyicisi açıklandığı şekilde harekete Parametre Doğrulama.Yürütülmesine devam etmek için izin verilmişse, bu işlevler kümesi errno için EINVAL ve -1 döndürür.

[!NOT]

Uygulamanız ile derlendiğinde if /clr ve uygulama çıkıldığı sonra raporlama işlevi ana denir, herhangi bir crt işlevleri Raporlama işlevini çağırırsa, clr bir özel durum oluşturur.

Gereksinimler

Yordamı

Gerekli başlık

İsteğe bağlı bir üstbilgi

_CrtSetReportHook2

<crtdbg.h>

<errno.h>

_CrtSetReportHookW2

<crtdbg.h>

<errno.h>

Daha fazla uyumluluk bilgileri için bkz: Uyumluluk giriş.

Kitaplıkları

Hata ayıklama sürümlerini c çalışma zamanı kitaplıkları yalnızca.

Ö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.

Başvuru

Hata Ayıklama Yordamları