Saltar al contenido principal

Línea de comandos de Windows, Windows con pestañas y software JP (Parte IV)

En mi última publicación hablé sobre algunas de las estrategias que probé para mostrar ventanas de consola en una ventana GUI durante el Take Command 9 diseño y desarrollo.

Las primeras tres ideas (las API de accesibilidad de Windows, inyectar un dll en aplicaciones de consola y asignar consolas desde el Take Command sesión) habían sido descartados después de encontrar fallas fatales. La idea número 4 era conectar las API de la consola de Windows, para poder interceptar cualquier llamada para leer o escribir en una ventana de la consola. (ReadConsole, ReadConsoleInput, WriteConsole, WriteConsoleOutput, etc.) En teoría, esto me proporcionaría una cobertura completa de cualquier E/S de la consola, para poder manejarlas, modificando o redirigiendo opcionalmente las E/S antes de pasarlas. En la práctica, resultó tener todas las desventajas del punto 2 (inyectar una dll), y algunas más:

  • Requería modificar dinámicamente otros programas (ver: ¿Es Take Command infectado con un virus!?).
  • Añadió un montón de complejidad adicional.
  • Parecía no haber forma de interceptar las misteriosas llamadas API ocasionales que parecían originarse en algún lugar profundo de Windows y que llamaban API de consola de nivel inferior no documentadas.
  • Encontré otra serie de API con errores y/o mal documentadas. (Algunos de los cuales encontré en los días de NT 3.x; aparentemente Microsoft no ha dado la máxima prioridad a mejorar la ventana de la consola en los últimos 15 años).
  • Como resultado de la falta de documentación de Microsoft sobre las API de la consola, muchos programas las llamaban incorrectamente. ¿Ignoro las malas llamadas? ¿Intentar corregirlos y transmitirlos? O simplemente procesarlos como se solicita, pasarlos y esperar que no estropeen el Take Command ¿Se muestra muy mal?

A punto de descartar toda la idea de las ventanas de consola con pestañas, pensé en revertir la idea n.° 3. En lugar de Take Command Al crear la consola y luego iniciar la aplicación de línea de comandos en esa ventana de la consola, ¿qué pasaría si iniciara la aplicación de línea de comandos (que luego crearía su propia ventana de consola oculta) y luego me conectaría? Take Command a esa ventana de la consola? Esta idea tenía algunas ventajas:

  • Ninguna aplicación antivirus se quejaría de esto.
  • Take Command podría compartir la ventana de la consola con la aplicación de línea de comandos (por ejemplo, TCC), y podría leer y escribir directamente en esa ventana, sin requerir ninguna comunicación entre procesos entre Take Command y la aplicación de línea de comando.
  • Take Command Podría cambiar fácilmente entre ventanas de pestañas desconectándose de la consola anterior y conectándola a la nueva.

Por supuesto, no iba a ser tan fácil. Hubo una cantidad inusual (incluso para Windows) de obstáculos:

  • Otra serie aparentemente interminable de API de Windows con errores o mal documentadas. Por ejemplo, algunas API se comportaron inesperadamente o fallaron por completo si la ventana de la consola estaba oculta.
  • Resultó ser un ejercicio nada trivial, incluso para algo tan aparentemente simple como Take Command para obtener de forma rápida y confiable el identificador de la ventana de la consola de la aplicación que acaba de iniciar.
  • El simple hecho de tener acceso a la ventana de la consola no significaba que pudiera actualizar el Take Command ventana rápidamente.
  • Tuve que monitorear todas las ventanas de la consola continuamente (incluso las que no estaban visibles en una ventana de pestaña) para poder determinar si la aplicación había cerrado, cambiado su ventana y/o el tamaño del búfer (no es infrecuente), (re)ocultar la consola. ventana si de alguna manera se hubiera vuelto visible (nuevamente, no es infrecuente), actualice los títulos de las pestañas, etc.
  • Capture las instancias en las que la aplicación de consola inició otra aplicación y luego salió (dejando la aplicación secundaria ejecutándose, pero con un ID de proceso diferente).
  • La entrada del teclado tuvo que ser manejada en Take Command, se filtró adecuadamente y luego se pasó a las ventanas de la consola.
  • El orden z de la ventana tuvo que ajustarse continuamente para que el foco estuviera en el lugar correcto.
  • Manejar la molesta tendencia de las aplicaciones de DOS a cambiar el tamaño del búfer de la ventana de la consola a 80×25. (Cuanto menos se hable del resto de los problemas al ejecutar aplicaciones de DOS, mejor).
  • Y tantos más que siento que me deslizo hacia un estado peligrosamente deprimido mientras revivo la larga pesadilla...

Si hubiera sabido todos los problemas que encontraría posteriormente, habría seguido buscando la idea número 6, o tal vez habría aceptado un trabajo como subgerente en el McDonald's local. Pero no lo sabía, así que gradualmente fui superando los problemas uno por uno hasta someterlos. Ocasionalmente mediante una programación increíblemente inteligente, pero sobre todo mediante un análisis heurístico intensivo (es decir, prueba y error). Resulta que hay una buena razón por la que sólo hay un pequeño puñado de otras aplicaciones que intentan implementar ventanas con pestañas para aplicaciones de consola (y la mayoría de ellas funcionan lenta y mal).

Este enfoque adoptado para Take Command La v9 todavía está en uso (simplificada y actualizada) para la v13, y no preveo ningún cambio arquitectónico importante en la próxima versión.

Entonces estamos actualizados y puedo volver a hablar sobre nuevas funciones (y nuevos problemas).