_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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk