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

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
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".
3.10 3.50 CRT redireccionar alças padrão

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 105305 - Última Revisão: 11/21/2006 15:41:01 - Revisão: 4.2

Microsoft Win32 Application Programming Interface

  • kbmt kbconsole kbinfo kbkernbase KB105305 KbMtpt
Comentários
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)