_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 rapport de débogage runtime C (version debug uniquement).
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Paramètres
mode
L'action à effectuer : _CRT_RPTHOOK_INSTALL ou _CRT_RPTHOOK_REMOVE.pfnNewHook
enregistrez le raccordement pour installer ou supprimer dans la version d'étroit-personnage de cette fonction.pfnNewHook
Enregistrez le raccordement pour installer ou supprimer dans la version à caractère élargi de cette fonction.
Valeur de retour
-1 si une erreur se produit, avec EINVAL ou ENOMEM définissez ; sinon retourne le décompte de références d' pfnNewHook après l'appel.
Notes
_CrtSetReportHook2 et _CrtSetReportHookW2vous permettent de connecter ou décrocher une fonction, alors que _CrtSetReportHook vous autorise uniquement raccorder une fonction.
_CrtSetReportHook2 ou _CrtSetReportHookW2doit être utilisé au lieu d' _CrtSetReportHook lorsque l'appel de raccordement s'effectue dans une DLL et lorsque les plusieurs DLL peuvent être chargés et exemple leurs propres fonctions de raccordement.Dans ce cas, les DLL peuvent être déchargés dans un ordre différent de celui dans lequel ils ont été chargés et la fonction de raccordement peut rester pointant vers une DLL déchargé.Toute sortie de débogage s'arrête le processus si les fonctions de raccordement était ajoutée à _CrtSetReportHook.
Toutes les fonctions de raccordement ajoutées avec _CrtSetReportHook sont appelées s'il n'existe aucune fonction de raccordement ajoutée à _CrtSetReportHook2 ou _CrtSetReportHookW2ou si toutes les fonctions de raccordement ajoutées avec _CrtSetReportHook2 et _CrtSetReportHookW2retournent FALSE.
La version à caractère élargi de cette fonction est disponible.Les fonctions de raccordement de rapport acceptant une chaîne dont le type (caractères ou étroits) doit correspondre à la version de cette fonction utilisée.Utilisez le prototype de fonction suivant pour les connexions d'état utilisés avec la version à caractère élargi de cette fonction :
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Utilisez le prototype suivant pour les connexions d'état d'étroit-personnage :
int YourReportHook( int reportType, char *message, int *returnValue );
ces fonctions valident leurs paramètres.si mode ou pfnNewNook est valide, ces fonctions appellent le gestionnaire de paramètre non valide, comme décrit dans Validation des paramètres.Si est autorisé à l'exécution de se poursuivre, ces errno défini par fonctions à EINVAL et à retourner -1.
[!REMARQUE]
Si votre application est compilée avec /clr et une fonctionnalité de création de rapports est appelée après que l'application soit arrêtée main, le CLR lèvera une exception si les appels de fonctions de création de rapports que tout fonctions 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 de compatibilité, consultez compatibilité dans l'introduction.
bibliothèques
Versions debug de Bibliothèques runtime C uniquement.
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