_CrtSetReportHook2 _CrtSetReportHookW2
安裝或解除安裝用戶端定義報告函式藉由將它連接到 c 執行階段偵錯報告程序 (偵錯版本)。
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
參數
mode
要採取的動作: _CRT_RPTHOOK_INSTALL或**_CRT_RPTHOOK_REMOVE**。pfnNewHook
報告攔截程序來安裝或移除之這個函式的窄字元版本。pfnNewHook
報告攔截程序來安裝或移除這個函式的寬字元版本。
傳回值
-1,如果發現錯誤,與EINVAL或ENOMEM設定為無效。 否則會傳回之參考次數的pfnNewHook呼叫後。
備註
_CrtSetReportHook2與**_CrtSetReportHookW2** 可讓您將連結,或攔截函式,而 _CrtSetReportHook 只能讓您攔截函式。
_CrtSetReportHook2或**_CrtSetReportHookW2** 應該用來代替**_CrtSetReportHook時攔截程序發出呼叫的 DLL,並可能載入多個 Dll,並設定他們自己攔截函式。 在這種情況下,Dll 可以卸載以不同方式比已載入而且可保留攔截函式,對準卸載 DLL。 如果攔截函式所加入的處理序當機的任何偵錯輸出_CrtSetReportHook**。
任何攔截與加入的函式**_CrtSetReportHook函式加入有沒有攔截程序時,會呼叫_CrtSetReportHook2或_CrtSetReportHookW2** ,否則所有攔截與加入的函式**_CrtSetReportHook2和_CrtSetReportHookW2** 傳回FALSE。
使用這個函式的寬字元版本。 報告攔截函式採用 (寬或較窄字元) 的型別必須符合的版本,使用這個函式的字串。 報告攔截函式之這個函式的寬字元版本搭配使用,請使用下列的函式原型:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
窄字元報告攔截函式,請使用下列的原型:
int YourReportHook( int reportType, char *message, int *returnValue );
這些函式會驗證它們的參數。 如果mode或pfnNewNook是無效的這些函式叫用無效的參數處理常式中,如所述參數驗證。 如果執行,則允許繼續執行,這些函式會設定errno到EINVAL ,並傳回-1。
![]() |
---|
如果您的應用程式時加以編譯/clr而報告的函式後,會呼叫應用程式已經結束主要,CLR 將會擲回例外狀況,如果報告函式呼叫任何的 CRT 函式。 |
需求
常式 |
所需的標頭 |
選擇性標頭 |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> |
<errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> |
<errno.h> |
如需相容性資訊,請參閱相容性在簡介中。
文件庫
偵錯版本的 C 執行階段程式庫只。
範例
// 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;
}
Output
_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