Bagikan melalui


_CrtSetReportHook2, _CrtSetReportHookW2

Menginstal atau menghapus instalan fungsi pelaporan yang ditentukan klien dengan menghubungkannya ke dalam proses pelaporan debug run-time C (hanya versi debug).

Sintaks

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

Parameter

mode
Tindakan yang harus diambil: _CRT_RPTHOOK_INSTALL atau _CRT_RPTHOOK_REMOVE.

pfnNewHook
Laporkan kait untuk menginstal atau menghapus dalam versi karakter sempit atau karakter lebar fungsi ini.

Nilai hasil

-1 jika terjadi kesalahan, dengan EINVAL atau ENOMEM atur; jika tidak, mengembalikan jumlah pfnNewHook referensi setelah panggilan.

Keterangan

_CrtSetReportHook2 dan _CrtSetReportHookW2 memungkinkan Anda menghubungkan atau melepas kait fungsi, sedangkan _CrtSetReportHook hanya memungkinkan Anda menghubungkan fungsi.

_CrtSetReportHook2 atau _CrtSetReportHookW2 harus digunakan alih-alih _CrtSetReportHook ketika panggilan hook dilakukan di DLL dan ketika beberapa DLL mungkin dimuat dan mengatur fungsi kait mereka sendiri. Dalam situasi seperti itu, DLL dapat dibongkar dalam urutan yang berbeda dari yang dimuat dan fungsi kait dapat dibiarkan menunjuk ke DLL yang tidak dimuat. Setiap output debug mengalami crash proses jika fungsi kait ditambahkan dengan _CrtSetReportHook.

Setiap fungsi kait yang ditambahkan dipanggil _CrtSetReportHook jika tidak ada fungsi kait yang ditambahkan dengan _CrtSetReportHook2 atau _CrtSetReportHookW2 jika semua fungsi kait ditambahkan dengan _CrtSetReportHook2 dan _CrtSetReportHookW2 mengembalikan FALSE.

Versi karakter lebar dari fungsi ini tersedia. Fungsi hook laporan mengambil string yang jenisnya (karakter lebar atau sempit) harus cocok dengan versi fungsi ini yang digunakan. Gunakan prototipe fungsi berikut untuk kait laporan yang digunakan dengan versi karakter luas dari fungsi ini:

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

Gunakan prototipe berikut untuk kait laporan karakter sempit:

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

Fungsi-fungsi ini memvalidasi parameternya. Jika mode atau pfnNewHook tidak valid, fungsi-fungsi ini memanggil handler parameter yang tidak valid, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, fungsi-fungsi ini diatur errno ke EINVAL dan mengembalikan -1.

Catatan

Jika aplikasi Anda dikompilasi dengan /clr dan fungsi pelaporan dipanggil setelah aplikasi keluar dari utama, CLR akan melemparkan pengecualian jika fungsi pelaporan memanggil fungsi CRT apa pun.

Persyaratan

Rutin Header yang diperlukan Header opsional
_CrtSetReportHook2 <crtdbg.h> <errno.h>
_CrtSetReportHookW2 <crtdbg.h> <errno.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Pustaka

Debug versi pustaka run-time C saja.

Contoh

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

Hasil

_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

Baca juga

Rutinitas debug