_CrtSetReportHook2, _CrtSetReportHookW2
Instaluje lub odinstalowuje funkcja raportowania zdefiniowana przez klienta przez podczepiania go do debugowania run-time C, zgłoszenie procesu (tylko wersja debugowania).
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Parametry
mode
Akcja: _CRT_RPTHOOK_INSTALL lub _CRT_RPTHOOK_REMOVE.pfnNewHook
Hak raportu do zainstalowania lub usunięcia w wersji znaków wąskim tej funkcji.pfnNewHook
Hak raportu do zainstalowania lub usunięcia w wersji szerokich znaków z tej funkcji.
Wartość zwracana
-1, jeśli wystąpił błąd z EINVAL lub ENOMEM Ustaw; w przeciwnym razie zwraca liczbę odwołań z pfnNewHook po wywołaniu.
Uwagi
_CrtSetReportHook2i _CrtSetReportHookW2 umożliwiają hook lub odpięcie funkcji, należy _CrtSetReportHook tylko umożliwia spinanie funkcji.
_CrtSetReportHook2lub _CrtSetReportHookW2 powinny być używane zamiast _CrtSetReportHook kiedy hak wywołanie biblioteki DLL i kiedy wiele bibliotek DLL może być załadowany i ustawienie ich własnych hook funkcji.W takiej sytuacji biblioteki DLL można być rozładowywane w innej kolejności niż zostały załadowane i funkcja hak można pozostawić naprzeciwko rozładowane biblioteki DLL.Dowolne dane wyjściowe debugowania awarii procesu, jeśli dodano funkcje haka z _CrtSetReportHook.
Dowolne hook funkcje dodane z _CrtSetReportHook są nazywane, jeśli nie istnieją żadne hook funkcje dodane z _CrtSetReportHook2 lub _CrtSetReportHookW2 lub jeśli hook wszystkie funkcje dodane z _CrtSetReportHook2 i _CrtSetReportHookW2 zwrotu FALSE.
Wersja szerokich znaków ta funkcja jest dostępna.Funkcje hook raport podjąć ciąg, którego typ (znaki szerokie lub wąskie) musi być zgodna wersja tej funkcji używane.Użyj następujących prototyp funkcji dla haki raport używany z wersją szerokich znaków tej funkcji:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Użyć następujący prototyp haki znak wąskim raportu:
int YourReportHook( int reportType, char *message, int *returnValue );
Te funkcje sprawdzania poprawności ich parametrów.Jeśli mode lub pfnNewNook jest nieprawidłowy, te funkcje wywołania obsługi nieprawidłowy parametr, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie może kontynuować, ustaw te funkcje errno do EINVAL i zwraca –1.
[!UWAGA]
Jeśli aplikacja została skompilowana z /clr i raportowania funkcja jest wywoływana po aplikacji został zakończony główne, środowisko CLR wygeneruje wyjątek funkcja raportowania wywołuje żadnych funkcji CRT.
Wymagania
Rozpoczęto wykonywanie procedury |
Wymaganego nagłówka |
Opcjonalne nagłówka |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> |
<errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> |
<errno.h> |
Informacji dotyczących zgodności, zobacz zgodności we wprowadzeniu.
Biblioteki
Debug wersje biblioteki uruchomieniowej c tylko.
Przykład
// 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;
}
Dane wyjściowe
_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