INFO: Chamada rotinas de CRT saída a partir de uma aplicação GUI, Graphical User Interface

Traduções de Artigos Traduções de Artigos
Artigo: 105305 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Para utilizar rotinas de saída C Run-time, tais como printf(), de uma aplicação GUI, Graphical User Interface, é necessário criar uma consola. A interface de programação de aplicações Win32 AllocConsole() (API) cria a consola. O setvbuf() rotina CRT remove a memória intermédia de modo a que saída seja imediatamente visível.

Este método funciona se a aplicação de interface gráfica do utilizador é executada na linha de comandos ou a partir do Gestor de ficheiros. No entanto, este método não funciona se a aplicação é iniciada a partir do Gestor de programas ou através do comando "start". O seguinte código mostra como contornar este 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 da consola correcta, associa uma nova cadeia desse identificador de baixo nível e substitua stdout essa sequência de nova. Este processo encarrega-se das funções que utilizam stdout, tais como printf() puts() e por aí em diante. Utilize o mesmo procedimento para stdin e stderr.

Tenha em atenção que este código não corrige problemas com alças de 0, 1 e 2. De facto, devido a outras complicações, não é possível corrigir este problema e, por isso, é necessário utilizar sequência de E/s em vez de E/s de nível inferior.

Mais Informação

Quando uma aplicação de interface gráfica do utilizador é iniciada com o "start"comando, o sistema operativo padrão três trata STD_INPUT_HANDLE, STD_OUTPUT_HANDLE e STD_ERROR_HANDLE são todos os"colocados fora" pelas rotinas de inicialização de consola. Estes três identificadores são substituídos por valores válidos quando a aplicação de interface gráfica chama AllocConsole(). Por conseguinte, depois de o fazer, chamar GetStdHandle() devolverá sempre os valores de identificador válido. O problema é que o CRT já concluiu a inicialização antes da aplicação obtém a oportunidade de chamar AllocConsole(); as três alças de E/s baixas 0, 1 e 2 já foram configuradas para utilizar o original colocado fora OS alças, para todas as E/s de CRT é enviada para inválido OS identificadores e saída CRT não aparece na consola. Utilize a solução descrita acima para resolver este problema.

No caso de iniciar a aplicação GUI, graphical user interface da linha de comandos sem o comando "start", as alças de sistema operativo padrão não são correctamente colocadas fora, mas incorrectamente são herdadas do Cmd.exe. Quando inicia CRT a aplicação, as três alças de E/s baixas 0, 1 e 2 são inicializadas para utilizar os números de identificador de três a aplicação herda cmd.exe. Quando a aplicação chamar AllocConsole(), as rotinas de inicialização de consola tentam substituir o que acredita a inicialização da consola seja padrão OS alça valores inválidos com valores de identificador válido a partir da nova consola. Por coincidence, porque as rotinas de inicialização de consola tendem a revelar os mesmos três valores para identificadores de sistema operativo padrão, initilization consola substituirá os valores de identificador de SO padrão, com os mesmos valores que foram existe--antes dos herdados do Cmd.exe. Por conseguinte, CRT E/s funciona neste caso.

É importante que compreenda que a capacidade de utilizar rotinas de CRT a partir de uma aplicação GUI, Graphical User Interface executar partir da linha de comandos não era por predefinição para esta poderá não funcionar em futuras versões do Windows NT ou Windows. Numa versão futura, poderá ser necessário a solução alternativa não apenas para aplicações iniciadas na linha de comandos com "start < nome da aplicação >", mas também para aplicações iniciadas na linha de comandos com "nome da aplicação".

Propriedades

Artigo: 105305 - Última revisão: 21 de novembro de 2006 - Revisão: 4.2
A informação contida neste artigo aplica-se a:
  • Microsoft Win32 Application Programming Interface 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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