_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 _CrtSetReportHook
eklendiyse 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 FALSE
tü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