_CrtSetReportHook2
, _CrtSetReportHookW2
Nainstaluje nebo odinstaluje funkci generování sestav definovanou klientem tak, že ji připojíte k procesu generování sestav ladění za běhu jazyka C (pouze ladicí verze).
Syntaxe
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Parametry
mode
Akce, která se má provést: _CRT_RPTHOOK_INSTALL
nebo _CRT_RPTHOOK_REMOVE
.
pfnNewHook
Volání sestavy pro instalaci nebo odebrání ve verzi této funkce s úzkým znakem nebo širokým znakem
Vrácená hodnota
-1, pokud byla zjištěna chyba s EINVAL
nebo ENOMEM
nastavenou chybou; v opačném případě vrátí počet pfnNewHook
odkazů za voláním.
Poznámky
_CrtSetReportHook2
a _CrtSetReportHookW2
nechte funkci zaháčkovat nebo odblokovat, zatímco _CrtSetReportHook
funkci můžete zaháčkovat pouze.
_CrtSetReportHook2
nebo _CrtSetReportHookW2
by se měla použít místo _CrtSetReportHook
při volání hooku v knihovně DLL a kdy může být načteno více knihoven DLL a nastavení jejich vlastních funkcí háku. V takové situaci lze knihovny DLL uvolnit v jiném pořadí, než byly načteny, a funkce háku může zůstat nasměrovaná na uvolněnou knihovnu DLL. Jakýkoli výstup ladění chybově ukončí proces, pokud byly přidány funkce háku s _CrtSetReportHook
.
Všechny funkce háku přidané pomocí _CrtSetReportHook
se volají, pokud nejsou přidány _CrtSetReportHook2
žádné funkce háku nebo _CrtSetReportHookW2
pokud všechny funkce háku přidané s _CrtSetReportHook2
a _CrtSetReportHookW2
vrácení FALSE
.
K dispozici je široká verze této funkce. Funkce háku sestavy přebírají řetězec, jehož typ (široké nebo úzké znaky) musí odpovídat použité verzi této funkce. Pro háky sestavy používané s širokoznakovou verzí této funkce použijte následující prototyp funkce:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Pro háky sestav s úzkými znaky použijte následující prototyp:
int YourReportHook( int reportType, char *message, int *returnValue );
Tyto funkce ověřují své parametry. Pokud mode
jsou nebo pfnNewHook
jsou neplatné, tyto funkce vyvolávají neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru. Pokud je spuštění povoleno pokračovat, tyto funkce jsou nastavené errno
na EINVAL
hodnotu -1 a vrátí hodnotu -1.
Poznámka:
Pokud je vaše aplikace zkompilována pomocí /clr a funkce generování sestav je volána po ukončení hlavní aplikace, CLR vyvolá výjimku, pokud funkce generování sestav volá některé funkce CRT.
Požadavky
Rutina | Požadovaný hlavičkový soubor | Volitelné záhlaví |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> | <errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> | <errno.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Knihovny
Ladění pouze verzí knihoven runtime jazyka C.
Příklad
// 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;
}
Výstup
_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