_CrtSetReportHook2
, _CrtSetReportHookW2
Installiert oder deinstalliert eine clientdefinierte Berichtsfunktion, indem sie mit dem Debug-Berichterstellungsprozess der C-Laufzeit verknüpft wird (nur Debugversion)
Syntax
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Parameter
mode
Die auszuführende Aktion: _CRT_RPTHOOK_INSTALL
oder _CRT_RPTHOOK_REMOVE
pfnNewHook
Melden Sie einen Hook, der in der schmalen oder breiten Zeichenversion dieser Funktion installiert oder entfernt werden soll.
Rückgabewert
-1, wenn ein Fehler aufgetreten ist, wobei EINVAL
oder ENOMEM
festgelegt wurde; andernfalls wird die Verweisanzahl von pfnNewHook
nach dem Aufruf zurückgegeben
Hinweise
_CrtSetReportHook2
und _CrtSetReportHookW2
ermöglichen Es Ihnen, eine Funktion zu haken oder zu lösen, während _CrtSetReportHook
Sie nur eine Funktion anhaken können.
_CrtSetReportHook2
oder _CrtSetReportHookW2
sollten anstelle von _CrtSetReportHook
verwendet werden, wenn der Hook-Aufruf in einer DLL erfolgt und mehrere DLLs geladen werden können und ihre eigenen Hookfunktionen festlegen. In einem solchen Fall können DLLs in einer anderen Reihenfolge entladen werden als der, in der sie geladen wurden, und die Hookfunktion kann weiterhin auf eine entladene DLL zeigen. Der Prozess wird durch jegliche Debugausgabe zum Abstürzen gebracht, falls die Hookfunktionen mit _CrtSetReportHook
hinzugefügt wurden.
Alle mit _CrtSetReportHook
hinzugefügten Hookfunktionen werden aufgerufen, wenn keine Hookfunktionen mit _CrtSetReportHook2
oder _CrtSetReportHookW2
hinzugefügt werden, oder wenn alle mit _CrtSetReportHook2
und _CrtSetReportHookW2
hinzugefügten Hookfunktionen FALSE
zurückgeben.
Die Breitzeichenversion dieser Funktion ist verfügbar. Die Hookfunktionen für Berichte nehmen eine Zeichenfolge entgegen, deren Typ (breite oder schmale Zeichen) der Version der verwendeten Funktion entsprechen muss. Verwenden Sie den folgenden Prototyp einer Hookfunktion für Berichte in der Breitzeichenversion dieser Funktion:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Verwenden Sie den folgenden Prototyp der Hookfunktion für Berichte in der Schmalzeichenversion:
int YourReportHook( int reportType, char *message, int *returnValue );
Diese Funktionen überprüfen ihre Parameter. Wenn mode
oder pfnNewHook
ungültig ist, rufen diese Funktionen den ungültigen Parameterhandler auf, wie in der Parameterüberprüfung beschrieben. Wenn die weitere Ausführung zugelassen wird, stellen diese Funktionen errno
auf EINVAL
ein und geben -1 zurück.
Hinweis
Wenn Ihre Anwendung mit /clr kompiliert wird und die Berichtsfunktion aufgerufen wird, nachdem die Anwendung den Hauptteil beendet hat, löst die CLR eine Ausnahme aus, wenn die Berichtsfunktion CRT-Funktionen aufruft.
Anforderungen
Routine | Erforderlicher Header | Optionaler Header |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> | <errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> | <errno.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Libraries
Nur Debugversionen von C-Laufzeitbibliotheken
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