INFO: Chamando rotinas de CRT saída de um aplicativo GUI

Traduções deste artigo Traduções deste artigo
ID do artigo: 105305 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Para usar rotinas de saída de tempo de execução C, como printf(), de um aplicativo de GUI, é necessário criar um console. A interface de programação de aplicativo Win32 (API) AllocConsole() cria o console. O setvbuf() rotina CRT remove buffer para que saída fique visível imediatamente.

Esse método funciona se o aplicativo GUI é executado a partir da linha de comando ou do Gerenciador de arquivos. No entanto, esse método não funciona se o aplicativo é iniciado no Gerenciador de programas ou através do comando "Início". O código a seguir mostra como solução alternativa para esse problema:
   int hCrt;
   FILE *hf;

   AllocConsole();
   hCrt = _open_osfhandle(
             (long) GetStdHandle(STD_OUTPUT_HANDLE),
             _O_TEXT
          );
   hf = _fdopen( hCrt, "w" );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
				
este código abre uma nova alça CRT baixo nível para a alça de saída console correto, associa um novo fluxo com esse identificador de nível inferior e substitui stdout esse novo fluxo. Esse processo se encarrega de funções que usam stdout, como printf(), puts() e assim por diante. Use o mesmo procedimento para stdin e stderr.

Observe que esse código não não corrige problemas com alças de 0, 1 e 2. Na verdade, devido a outras complicações, não é possível corrigir o problema e, portanto, é necessário usar E/s de fluxo em vez de E/s de nível inferior.

Mais Informações

Quando um aplicativo GUI é iniciado com o "Iniciar"comando, três OS padrão manipula STD_INPUT_HANDLE STD_OUTPUT_HANDLE e STD_ERROR_HANDLE são todos os"zerado" pelas rotinas de inicialização console. Esses três alças são substituídas por valores válidos quando o aplicativo GUI chama AllocConsole(). Portanto, feito isso, chamar GetStdHandle() sempre retornará valores de identificador válido. O problema é que a CRT já concluiu a inicialização antes de seu aplicativo tem a chance para chamar AllocConsole(); as três alças de E/s baixas 0, 1 e 2 já foram configuradas para usar o original zerado OS identificadores, para que todas as E/s CRT é enviada para inválido OS identificadores e CRT saída não aparece no console. Use a solução descrita acima para eliminar esse problema.

No caso de iniciar o aplicativo GUI da linha de comando sem o comando "start", as alças de sistema operacional padrão são não corretamente zeradas, mas incorretamente são herdadas do cmd.exe. Quando CRT do aplicativo é inicializado, as três alças de E/s baixas 0, 1 e 2 são inicializadas para usar os números de três alça que o aplicativo herda cmd.exe. Quando o aplicativo chama AllocConsole(), as rotinas de inicialização console tentar substituir a inicialização do console acredita ser valores de identificador OS padrão inválidos com valores de identificador válido do novo console. Por uma coincidência, porque as rotinas de inicialização console tendem a dar os mesmos três valores para as alças de sistema operacional padrão, initilization console será substitua os valores padrão de identificador de OS com os mesmos valores que existiam antes--as herdadas do cmd.exe. Portanto, E/s de CRT funciona nesse caso.

É importante perceber que a capacidade de usar CRT rotinas de um aplicativo GUI executado a partir da linha de comando não estava por design então isso pode não funcionar em futuras versões do Windows NT ou do Windows. Em uma versão futura, talvez seja necessário a solução alternativa não apenas para aplicativos iniciados na linha de comando com "início < nome do aplicativo >", mas também para aplicativos iniciados na linha de comando com "nome do aplicativo".

Propriedades

ID do artigo: 105305 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 4.2
A informação contida neste artigo aplica-se a:
  • Interface de Programação de Aplicativos do Microsoft Win32 nas seguintes plataformas
    • Microsoft Windows NT Advanced Server 3.1
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • the operating system: Microsoft Windows XP
Palavras-chave: 
kbmt kbconsole kbinfo kbkernbase KB105305 KbMtpt
Traduçã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: 105305

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com