_CrtSetReportHook2, _CrtSetReportHookW2

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Instala o desinstala una función definida por el cliente de supervisión al enlazar con el proceso informes de depuración en tiempo de ejecución de C (solo versión de depuración).

  
      int _CrtSetReportHook2(  
   int mode,  
   _CRT_REPORT_HOOK pfnNewHook  
);  
int _CrtSetReportHookW2(  
   int mode,  
   _CRT_REPORT_HOOKW pfnNewHook  
);  

Parámetros

mode
La acción que se realizará: _CRT_RPTHOOK_INSTALL o _CRT_RPTHOOK_REMOVE.

pfnNewHook
Enlace de informe para instalar o quitar en la versión de caracteres estrechos de esta función.

pfnNewHook
Enlace de informe para instalar o quitar en la versión con caracteres anchos de esta función.

-1 si se produce un error, con EINVAL o ENOMEM establecer; de lo contrario, devuelve el recuento de referencias de pfnNewHook después de la llamada.

_CrtSetReportHook2y _CrtSetReportHookW2 permiten enlazar o desenlazar una función, mientras que _CrtSetReportHook sólo permite una función de enlace.

_CrtSetReportHook2o _CrtSetReportHookW2 debe utilizarse en lugar de _CrtSetReportHook cuando se realiza la llamada de enlace en un archivo DLL y cuando se pueden cargar varios archivos DLL y establecer sus propias funciones de enlace. En tal situación, se pueden descargar archivos DLL en un orden diferente que se cargaron y la función de enlace puede ser hacia la izquierda en un archivo DLL de descarga. Los resultados de la depuración bloquea el proceso si se han agregado las funciones de enlace con _CrtSetReportHook.

Cualquier enlazar las funciones agregadas con _CrtSetReportHook se llama si no hay ningún enlace de funciones de agregan con _CrtSetReportHook2 o _CrtSetReportHookW2 o si todas las funciones agregadas con de enlace _CrtSetReportHook2 y _CrtSetReportHookW2 devolver FALSE.

La versión con caracteres anchos de esta función está disponible. Las funciones de enlace de informe toman una cadena cuyo tipo (caracteres anchos o estrechos) debe coincidir con la versión de esta función se utiliza. Utilice el siguiente prototipo de función para los enlaces de informe que se utiliza con la versión con caracteres anchos de esta función:

int YourReportHook( int reportType, wchar_t *message, int *returnValue );  

Para los enlaces de informe de caracteres estrechos, utilice el siguiente prototipo:

int YourReportHook( int reportType, char *message, int *returnValue );  

Estas funciones validan sus parámetros. Si mode o pfnNewNook es válido, estas funciones invocan el controlador de parámetros no válidos, como se describe en validación del parámetro. Si la ejecución puede continuar, estas funciones establecen errno en EINVAL y devuelven -1.

System_CAPS_ICON_note.jpg Nota

Si la aplicación se compila con /clr y se llama a la función de creación de informes una vez que la aplicación se ha cerrado, CLR inicia una excepción si la función de creación de informes llama a cualquier función de CRT.

RutinaEncabezado necesarioEncabezado opcional
_CrtSetReportHook2<crtdbg.h><errno.h>
_CrtSetReportHookW2<crtdbg.h><errno.h>

Para obtener más información sobre compatibilidad, vea Compatibility en la introducción.

Versiones de depuración de bibliotecas en tiempo de ejecución de C solo.

// 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;  
}  

_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  

Rutinas de depuración

Mostrar: