_CrtSetReportHook2, _CrtSetReportHookW2
Installiert oder deinstalliert eine clientdefinierte Berichtsfunktion indem das Haken in den Prozess der C-Laufzeit - Debuggen von Berichten (nur Debugversion).
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Parameter
mode
Die Aktion, die ausgeführt werden soll: _CRT_RPTHOOK_INSTALL oder _CRT_RPTHOOK_REMOVE.pfnNewHook
In der Enge Zeichen Version dieser Funktion zu installieren oder zu entfernen, hook Berichts.pfnNewHook
In einer Breitzeichen-Version dieser Funktion zu installieren oder zu entfernen, hook Berichts.
Rückgabewert
-1, wenn ein Fehler aufgetreten ist, mit EINVAL oder legen Sie ENOMEM fest. Andernfalls wird der Verweiszähler der pfnNewHook nach dem Aufruf zurück.
Hinweise
_CrtSetReportHook2 und verknüpfen Sie können _CrtSetReportHookW2oder heben eine Funktion Verknüpfung auf, während _CrtSetReportHook verknüpfen Sie nur eine Funktion können.
_CrtSetReportHook2 oder _CrtSetReportHookW2sollten anstelle _CrtSetReportHook Hookfunktion verwendet werden, wenn der Aufruf erfolgt in einer DLL, als mehrere DLLs Festlegen und geladen werden und ihre eigenen Hookfunktionen.In einer solchen Situation kann DLLs in einer anderen Reihenfolge als entladen werden sie geladen wurden und die Hookfunktion an einem genommenen DLL entladen, zeigen gelassen werden kann.Alle debuggen abstürze Ausgabe des Prozesses, wenn die Hookfunktionen mit _CrtSetReportHookhinzugefügt wurden.
Alle Hookfunktionen, die mit _CrtSetReportHook hinzugefügt werden, werden aufgerufen, wenn keine vorhanden sind, die mit _CrtSetReportHook2 Hookfunktionen hinzugefügt oder _CrtSetReportHookW2oder wenn alle Hookfunktionen, die mit _CrtSetReportHook2 und _CrtSetReportHookW2hinzugefügt werden, FALSEzurückgeben.
Die Breitzeichen-Version dieser Funktion ist verfügbar.Die Berichts hookfunktionen nehmen eine Zeichenfolge, deren Typ (schmale Zeichen) oder breit die Version der verwendeten Funktion übereinstimmen muss.Verwenden Sie den folgenden hooks Funktionsprototyp für die Berichtsansicht der Breitzeichen-Version dieser Funktion verwendet werden:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Verwenden Sie den folgenden Prototypen für die Enge Zeichen Berichts hooks:
int YourReportHook( int reportType, char *message, int *returnValue );
Diese Funktionen überprüfen deren Parameter.Wenn mode oder pfnNewNook nicht gültig ist, rufen diese Funktionen der ungültige Parameter für ein, wie in Parametervalidierungbeschrieben.Wenn die Ausführung fortgesetzt werden kann, darf dieses Features zu EINVAL und legen errno return -1.
![]() |
---|
Wenn die Anwendung mit /clr kompiliert und die Berichtsfunktion aufgerufen wird, nachdem die Anwendung main abgeschlossen ist, löst die CLR eine Ausnahme aus, wenn die Berichten funktionsaufrufe entweder CRT-Funktionen. |
Anforderungen
Routine |
Erforderlicher Header |
Optionaler Header |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> |
<errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> |
<errno.h> |
Weitere Informationen finden Sie unter Kompatibilität Kompatibilität in der Einführung.
Bibliotheken
Debugversionen von nur C .
Beispiel
// 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;
}
Output
_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