_CrtSetReportHook2, _CrtSetReportHookW2
Instala ou desinstala uma função definida pelo cliente de relatório enganchando-lo para a depurar de time de execução C (somente versão de depurar) do processo de geração de relatórios.
int _CrtSetReportHook2(
int mode,
_CRT_REPORT_HOOK pfnNewHook
);
int _CrtSetReportHookW2(
int mode,
_CRT_REPORT_HOOKW pfnNewHook
);
Parâmetros
mode
A ação a ser executada: _CRT_RPTHOOK_INSTALL or _CRT_RPTHOOK_REMOVE.pfnNewHook
Gancho do relatório para instalar ou remover na versão restringir caractere dessa função.pfnNewHook
Gancho do relatório para instalar ou remover na versão dessa função caractere largo.
Valor de retorno
-1 se ocorreu um erro, com EINVAL ou ENOMEM conjunto; caso contrário, retorna a referência de contagem de pfnNewHook Após a telefonar.
Comentários
_CrtSetReportHook2 e _CrtSetReportHookW2 permitem conectar ou desencaixe uma função, enquanto _CrtSetReportHook só permite capturar uma função.
_CrtSetReportHook2 ou _CrtSetReportHookW2 deve ser usado em vez de _CrtSetReportHook Quando a telefonar do gancho é feita em uma DLL e várias DLLs podem ser carregadas e definindo suas próprias funções de gancho quando. Nessa situação, DLLs podem ser descarregadas em uma ordem diferente que eles foram carregados e a função de gancho pode ser deixada apontando para uma DLL descarregada.Qualquer saída de depurar trava o processo se as funções de gancho foram adicionadas com _CrtSetReportHook.
Qualquer capturar funções adicionadas com _CrtSetReportHook são chamados se não houver nenhum gancho funções adicionadas com _CrtSetReportHook2 ou _CrtSetReportHookW2 ou se todos os conectar funções adicionadas com _CrtSetReportHook2 e _CrtSetReportHookW2 return FALSE.
A versão de caractere largo desta função está disponível em Visual C++ 2005. As funções de gancho de relatório sejam uma seqüência de caracteres cujo tipo (caracteres larga ou estreitas) deve corresponder à versão dessa função usada.Use o seguinte protótipo de função para os ganchos do relatório usados com a versão de caractere largo desta função:
int YourReportHook( int reportType, wchar_t *message, int *returnValue );
Use o seguinte protótipo para ganchos restringir caractere relatório:
int YourReportHook( int reportType, char *message, int *returnValue );
Essas funções validar seus parâmetros.If mode ou pfnNewNook é inválido, essas funções chamar o manipulador de parâmetro inválido sistema autônomo descrito em Validação de parâmetro. Se a execução for permitida para continuar, essas funções conjunto errno para EINVAL e retornar -1.
Observação: |
---|
Se seu aplicativo é compilado com /clr e a função de relatório é chamada após o aplicativo foi encerrado principal, o CLR lançará uma exceção se a função de relatório chama as funções de CRT. |
Requisitos
Rotina |
Cabeçalho necessário |
Cabeçalho opcional |
---|---|---|
_CrtSetReportHook2 |
<crtdbg.h> |
<errno.h> |
_CrtSetReportHookW2 |
<crtdbg.h> |
<errno.h> |
Para obter mais informações de compatibilidade, consulte Compatibilidade na introdução.
Bibliotecas
Versões de depurar de Bibliotecas de time de execução c somente.
Exemplo
// 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;
}
Saída
_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