_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