_CrtSetReportHook2, _CrtSetReportHookW2
Installe ou désinstalle une fonction de rapport définie par le client en l'accrochant dans le processus de création de débogage du runtime C (version Debug uniquement).
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Paramètres
mode
Action à effectuer :_CRT_RPTHOOK_INSTALL or _CRT_RPTHOOK_REMOVE.pfnNewHook
Enregistrez le raccordement pour installer ou supprimer dans la version de étroit- caractère de cette fonction.pfnNewHook
Enregistrez le raccordement pour installer ou supprimer dans la version de étroit- caractère de cette fonction.
Valeur de retour
-1 si une erreur est rencontrée, avec EINVAL ou ENOMEM définissez ; sinon retourne le nombre de références d'pfnNewHook après l'appel.
Notes
_CrtSetReportHook2 et _CrtSetReportHookW2 vous permettent de décrocher accrocher ou une fonction, alors qu' _CrtSetReportHook vous permet uniquement accrocher une fonction.
_CrtSetReportHook2 ou _CrtSetReportHookW2 doit être utilisé au lieu _CrtSetReportHook l'appel de raccordement s'effectue dans une DLL et lorsque les DLL multiples peuvent être chargés et définissants leurs propres fonctions de raccordement. Dans ce type de situation, les DLL peuvent être déchargé dans un ordre différent qu'ils ont été chargés et la fonction de raccordement peut pas être modifiée le curseur dans une DLL déchargé. Toute sortie de débogage se bloque le processus si les fonctions de raccordement ont été ajoutées à _CrtSetReportHook.
Toutes les fonctions de raccordement ajoutées à _CrtSetReportHook sont appelées s'il n'existe aucune fonction de raccordement ajoutée à _CrtSetReportHook2 ou _CrtSetReportHookW2 ou si toutes les fonctions de raccordement ajoutées à _CrtSetReportHook2 et _CrtSetReportHookW2 retournent FALSE.
La version de caractères larges de cette fonction est disponible. Les fonctions de raccordement de rapport prennent une chaîne de type (caractères larges ou étroits) doit correspondre à la version de cette fonction. Utilisez le prototype de la fonction suivant pour les raccordements de rapport utilisés avec la version de caractères larges de cette fonctionnalité :
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Utilisez le prototype suivant pour les raccordements de rapport d'étroit- caractère :
int YourReportHook( int reportType, char *message, int *returnValue );
Ces fonctions valident leurs paramètres. Si mode ou pfnNewNook est invalide, ces fonctions appellent le gestionnaire de paramètres non valides, comme décrit dans Validation de paramètre. Si l'exécution est autorisée à se poursuivre, ces fonctions définissent errno avec la valeur EINVAL et retournent -1.
Notes
Si votre application est compilée avec /clr et la fonction de rapport est appelée après que l'application ai arrêté Main, le CLR lève une exception si les fonction de rapport appellent n'importe quelle fonction CRT.
Configuration requise
Routine |
En-tête requis |
En-tête facultatif |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> |
<errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> |
<errno.h> |
Pour plus d'informations sur la compatibilité, consultez Compatibilité dans l'introduction.
Bibliothèques
Seulement les versions debug des bibliothèques Runtime C.
Exemple
// 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;
}
Sortie
_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