DetailPage-MSS-KB

Base de Dados de Conhecimento

ID do artigo: 134284 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 3.2

 

Nesta página

Sintomas

Aplicativos de console chamam SetConsoleCtrlHandler() para instalar ou remover funções de retorno de chamada definida pelo aplicativo para lidar com sinais de controle do console. Normalmente uma janela do console com foco do teclado recebe os sinais CTRL_C_EVENT e CTRL_BREAK_EVENT quando forem pressionadas as teclas CTRL + C e COMBINAÇÃO de teclas CTRL+BREAK ou se eles são gerados usando a função GenerateConsoleCtrlEvent(). Mas o sistema gera sinais CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT e CTRL_SHUTDOWN_EVENT quando o usuário fecha o console, logoff ou desliga o sistema para que o processo de console tem a oportunidade de limpar antes do término.

No Windows 95, aplicativos de console que instalar o console controle manipulador de funções usando SetConsoleCtrlHandler() não sempre obtém todos os sinais de console quando dois ou mais sinais ocorrem quase ao mesmo tempo.

Observe que esse problema não ocorre em versões do Windows NT 3.51 e 4.0.

Causa

O sistema de console do Windows 95 não fila sinais de controle do console ou eventos. Se vários eventos rapidamente ocorrerem em sucessão, eventos recebidos posteriormente substituir os recebidos anteriormente, resultando nos eventos anteriores sejam perdidos. O número de eventos que o aplicativo de console recebe depende quando os eventos realmente chegarem; o menor intervalo entre os eventos, mais provável que um ou mais serão perdidas.

Situação

A Microsoft confirmou este é um bug em produtos Microsoft listados no começo deste artigo. Estamos estiver pesquisando esse problema e divulgaremos novas informações na Base de dados de Conhecimento da Microsoft como ele se torna disponível.

Mais Informações

O código a seguir demonstra o problema. Ele deve receber CTRL_C_EVENT cinco e cinco eventos CTRL_BREAK_EVENT e imprimir uma linha para cada. No entanto, como eventos não são enfileirados, ele imprimirá menor do que cinco de cada tipo de evento e pode imprimir apenas o último CTRL_BREAK_EVENT.

Código de exemplo para demonstrar problema

 // Console Application
 #include <windows.h>
 #include <stdio.h>

 BOOL WINAPI CtrlHandler (DWORD dwEvent);

 void main (void)
 {
    printf ("Installing handler\n");
    SetConsoleCtrlHandler (CtrlHandler, TRUE);

    GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_C_EVENT, 0);

    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, 0);
    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, 0);

    printf ("Removing handler\n");
    SetConsoleCtrlHandler (CtrlHandler, FALSE);
 }

 BOOL WINAPI CtrlHandler (DWORD dwEvent)
 {
    switch (dwEvent)
       {
       case CTRL_C_EVENT:
          printf("Got CTRL_C_EVENT\n");
          break;

       case CTRL_BREAK_EVENT:
          printf("Got CTRL_BREAK_EVENT\n");
          break;

       case CTRL_LOGOFF_EVENT:
          printf("Got CTRL_LOGOFF_EVENT\n");
          break;

       case CTRL_SHUTDOWN_EVENT:
          printf("Got CTRL_SHUTDOWN_EVENT\n");
          break;

       case CTRL_CLOSE_EVENT:
          printf("Got CTRL_CLOSE_EVENT\n");
          break;

       default:
          // unknown type--better pass it on.
          return (FALSE);
       }
    // Handled all known events
    return (TRUE);
 }
				

A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Palavras-chave: 
kbmt kbbug kbconsole kbkernbase kbprogramming KB134284 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 134284  (http://support.microsoft.com/kb/134284/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.
Compartilhar
Opções de suporte adicionais
Fóruns de Suporte do Microsoft Community
Contate-nos diretamente
Localize um parceiro certificado da Microsoft
Microsoft Store