INFORMACIÓN: Llamar A rutinas de CRT resultados desde una aplicación GUI

Seleccione idioma Seleccione idioma
Id. de artículo: 105305 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Para utilizar rutinas de salida de tiempo de ejecución C, como printf() desde una aplicación GUI, es necesario crear una consola. La interfaz de programación de aplicaciones de Win32 (API) AllocConsole() crea la consola. El setvbuf() rutina CRT quita el búfer de forma que salida es visible inmediatamente.

Este método funciona si la aplicación de GUI se ejecuta desde la línea de comandos o desde Administrador de archivos. Sin embargo, este método no funciona si la aplicación se inicia desde el Administrador de programas o mediante el comando "start". El código siguiente muestra cómo evitar 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 un identificador de CRT de bajo nivel nuevo para el identificador de salida de consola correcta, asocia una nueva secuencia ese controlador de bajo nivel y reemplaza stdout con esa nueva secuencia. Este proceso se encarga de funciones que utilizan stdout, como printf() puts() y así sucesivamente. Utilice el mismo procedimiento para stdin y stderr.

Tenga en cuenta que este código no corrige los problemas con controladores de 0, 1 y 2. De hecho, debido a otras complicaciones, no es posible corregir este problema y, por lo tanto, es necesario utilizar E/s de secuencia en lugar de E/s de bajo nivel.

Más información

Cuando una aplicación GUI se inicia con la "start"comando, el sistema operativo estándar tres controla STD_INPUT_HANDLE STD_OUTPUT_HANDLE y STD_ERROR_HANDLE son todos"ceros" las rutinas de inicialización de la consola. Estos tres identificadores se reemplazan por los valores válidos cuando la aplicación de GUI llama a AllocConsole(). Por lo tanto, una vez hecho esto, llamar a GetStdHandle() devolverá siempre los valores de identificador válido. El problema es que el CRT ya ha completado la inicialización antes de la aplicación obtiene una oportunidad para llamar a AllocConsole(); los tres controladores de E/s bajos 0, 1 y 2 ya se han configurado para utilizar el original cero identificadores de sistema operativo, por lo que todas las E/s de CRT se envía a identificadores de sistema operativo no válidos y salida de CRT no aparece en la consola. Utilizar la solución descrita anteriormente para eliminar este problema.

En el caso de iniciar la aplicación de GUI desde la línea de comandos sin el comando "start", los controladores de sistema operativo estándar son no correctamente ceros pero incorrectamente se heredan desde cmd.exe. Cuando se inicializa el CRT de la aplicación, se inicializan los tres controladores de E/s bajos 0, 1 y 2 para utilizar los números de tres identificador que hereda de la aplicación de cmd.exe. Cuando la aplicación llama a AllocConsole(), las rutinas de inicialización de la consola intentarán reemplazar lo que considera la inicialización de consola que no es válidos valores de identificador OS estándar con valores de identificador válido de la nueva consola. Por casualidad, ya que las rutinas de inicialización de la consola tienden a los mismos tres valores para los identificadores de sistema operativo estándar, la inicialización de la consola reemplazará los valores de identificador de sistema operativo estándar con los mismos valores que hay antes--los heredados de cmd.exe. Por lo tanto, E/s de CRT funciona en este caso.

Es importante tener en cuenta que la posibilidad de utilizar CRT rutinas desde una aplicación GUI ejecutar desde la línea de comandos no por diseño por lo que esto puede no funciona en futuras versiones de Windows NT o Windows. En una versión futura, puede necesitar la solución no sólo para las aplicaciones iniciadas en la línea de comandos con "inicio < nombre de aplicación >", pero también para las aplicaciones iniciadas en la línea de comandos con "nombre de aplicación".

Propiedades

Id. de artículo: 105305 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 4.2
La información de este artículo se refiere a:
  • Microsoft Win32 Application Programming Interface sobre las siguientes 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
Palabras clave: 
kbmt kbconsole kbinfo kbkernbase KB105305 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 105305

Enviar comentarios

 

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