_CrtSetReportHook2, _CrtSetReportHookW2
Nainstaluje nebo odinstaluje přídavné funkce klienta definované podle zapojení do c spuštění ladění procesu (pouze ladicí verze) vykazování.
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Parametry
mode
Akci: _CRT_RPTHOOK_INSTALL nebo _CRT_RPTHOOK_REMOVE.pfnNewHook
Sestava háčkem instalace nebo odebrání znaků úzký verze této funkce.pfnNewHook
Sestava háčkem instalace nebo odstranění celého znaku verze této funkce.
Vrácená hodnota
-1, pokud došlo k chybě, s EINVAL nebo ENOMEM nastavení; v opačném případě vrátí referenční počet pfnNewHook po volání.
Poznámky
_CrtSetReportHook2a _CrtSetReportHookW2 umožňují zavěšení nebo vyjmutí funkci, že _CrtSetReportHook umožňuje pouze funkci zavěšení.
_CrtSetReportHook2nebo _CrtSetReportHookW2 by měl použít místo _CrtSetReportHook při zavěšení zavolání se knihovna DLL a kdy může načíst více knihoven DLL a nastavení jejich zavěšení funkce.Než bylo naloženo a háčkem funkce může být ponecháno na vyložení DLL, můžete v takové situaci uvolňování knihoven DLL v jiném pořadí.Výstup ladění dojde proces s byly přidány funkce háčkem _CrtSetReportHook.
Žádné zavěšení přidané pomocí funkce _CrtSetReportHook se nazývají, pokud neexistují žádné háčkem přidány funkce s _CrtSetReportHook2 nebo _CrtSetReportHookW2 nebo pokud všechny zavěšení přidané pomocí funkce _CrtSetReportHook2 a _CrtSetReportHookW2 vrátit FALSE.
Znak wide verze této funkce je k dispozici.Funkce háčkem zprávu přijmout řetězec, jehož typ (úzký široké znaků) musí odpovídat verzi této funkce.Použijte následující funkce prototypu háčků sestavy s širokým znak verze této funkce:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Použijte následující prototypu háky úzký znak sestavy:
int YourReportHook( int reportType, char *message, int *returnValue );
Tyto funkce ověřit jejich parametrů.Pokud mode nebo pfnNewNook je neplatný, tyto funkce vyvolat popisovač neplatný parametr popsaným v Ověření parametru.Pokud je povoleno spuštění pokračovat, nastavit tyto funkce errno na EINVAL a vrátí -1.
[!POZNÁMKA]
Pokud aplikace je kompilována s /clr a přídavné funkce se nazývá po aplikaci byl ukončen hlavní, CLR vyvolají výjimku, pokud zpravodajské funkce volá všechny funkce CRT.
Požadavky
Rutina |
Požadované záhlaví |
Volitelné záhlaví |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> |
<errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> |
<errno.h> |
Další informace o kompatibilitě v tématu Compatibility v úvodu.
Knihovny
Ladění verze C Runtime knihovny pouze.
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ýsledek
_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