Become a member!

WinInspector 2.1: Funcionalidades Avanzadas para Desarrolladores Delphi

  • 👉 This article is available in english.
  • 👉 Questo articolo è disponibile anche in italiano.
  • 👉 Este artículo también está disponible en español.

Hace unos meses lancé WinInspector, el sucesor espiritual de mi TDWinInfo de hace 20 años. La respuesta de la comunidad ha sido positiva, y varios desarrolladores han enviado solicitudes de funcionalidades y sugerencias. WinInspector 2.1 introduce nuevas funcionalidades diseñadas específicamente para desarrolladores Delphi y C++Builder.

Novedades de la Versión 2.1

Esta versión transforma WinInspector en un conjunto completo de herramientas de análisis para desarrolladores Windows. Estas son las principales adiciones.

🎨 VCL Component Inspector: Validación Comportamental

El VCL Component Inspector identifica componentes VCL/FMX en aplicaciones Delphi y C++Builder utilizando un enfoque de validación comportamental en lugar de depender únicamente de los nombres de clase.

El Problema de los Nombres de Clase:

Los nombres de clase de Windows (obtenidos mediante GetClassName) pueden ser ambiguos o genéricos. Un control llamado “TCheckBox” podría no ser realmente un checkbox VCL, sino un control personalizado con un nombre similar.

La Solución: Validación Mediante Mensajes de Windows:

WinInspector verifica la identidad de los controles enviando mensajes específicos de Windows y analizando las respuestas. Si un control responde correctamente a los mensajes típicos de su tipo, se considera validado.

// Ejemplo: Verificar si es realmente un checkbox
var CheckState := SendMessage(Handle, BM_GETCHECK, 0, 0);
case CheckState of
  BST_UNCHECKED: // Responde como checkbox → validado
  BST_CHECKED: // Responde como checkbox → validado
  BST_INDETERMINATE: // Checkbox de tres estados → validado
end;

Mensajes de Validación por Tipo:

  • CheckBox/RadioButton: BM_GETCHECK para verificar la capacidad de manejar estados marcado/desmarcado
  • ListBox/ComboBox: LB_GETCOUNT / CB_GETCOUNT para confirmar la gestión de listas de elementos
  • Edit/Memo: Verificación de flags de estilo (ES_READONLY, ES_MULTILINE, ES_PASSWORD)
  • Button: Análisis de estilo para detectar botones predeterminados (BS_DEFPUSHBUTTON)

Por Qué Este Enfoque es Superior:

  1. Certeza del tipo: No confiamos solo en el nombre, verificamos que el control realmente se comporte como debería
  2. Cross-process: Funciona mediante mensajes de Windows API, sin necesidad de RTTI (limitado a in-process)
  3. Robustez: Si un control no responde a los mensajes esperados, simplemente se excluye del análisis VCL
  4. Compatibilidad: Funciona en cualquier aplicación Delphi/C++Builder externa, incluso en producción

Este método de validación comportamental garantiza que WinInspector identifique solo componentes VCL auténticos, evitando falsos positivos.

🔗 Jerarquía Completa de Ventanas

Una de las funcionalidades más útiles de WinInspector 2.1 es la visualización de la jerarquía completa de ventanas. Cuando se posiciona el mouse sobre un control, la herramienta no solo muestra el control actual, sino toda la cadena de padres hasta la ventana raíz.

Por qué es importante:

En aplicaciones VCL/FMX complejas, los controles a menudo están anidados en múltiples niveles de contenedores (Panel, GroupBox, TabSheet, etc.). Comprender esta estructura es fundamental para:

  • Depurar problemas de diseño y posicionamiento
  • Analizar la estructura de UI de aplicaciones de terceros
  • Comprender la arquitectura de formularios complejos
  • Identificar el contexto de un control

Ejemplo de salida:

📊 WINDOW HIERARCHY (bottom → top):
   [0] 0x12345 - TButton ("OK")
      [1] 0x23456 - TPanel
         [2] 0x34567 - TGroupBox ("Options")
            [3] 0x45678 - TTabSheet ("General")
               [4] 0x56789 - TPageControl
                  [5] 0x67890 - TForm1 ("Settings")

La jerarquía muestra para cada nivel:

  • Número de nivel [0], [1], [2]… desde el control hasta la raíz
  • Handle de la ventana en formato hexadecimal
  • Clase del control (TButton, TPanel, TForm, etc.)
  • Título/Caption de la ventana (si está presente)
  • Indentación visual que resalta la profundidad de anidamiento

Esta visualización aclara inmediatamente la estructura jerárquica de la interfaz, permitiendo comprender el contexto en el que se encuentra un control específico.

📚 DLL/Library Inspector: Análisis de Dependencias

El DLL Inspector proporciona información detallada sobre las bibliotecas cargadas por una aplicación, facilitando la resolución de problemas de dependencias y despliegue.

Características Principales:

Enumeración Completa:

  • Lista todas las DLL cargadas por el proceso
  • Rutas completas para cada biblioteca
  • Extracción de información de versión de archivo
  • Ordenamiento alfabético

Detección Heurística de la Versión Delphi/C++Builder:

WinInspector identifica automáticamente la versión de Delphi o C++Builder analizando los paquetes BPL cargados. La detección es heurística y se basa en los números de versión incorporados en los nombres de archivo BPL.

Cada versión de Delphi usa un número de paquete específico:

  • rtl370.bpl, vcl370.bplDelphi 13 Florence
  • rtl290.bpl, vcl290.bplDelphi 12 Athens
  • rtl280.bpl, vcl280.bplDelphi 11 Alexandria
  • rtl270.bpl, vcl270.bplDelphi 10.4 Sydney
  • rtl260.bplDelphi 10.3 Rio
  • Y así sucesivamente hasta XE2 (160)

La herramienta busca estos patrones numéricos (370, 290, 280, etc.) en los nombres de archivo BPL y mapea automáticamente a la versión correspondiente. Este enfoque heurístico es confiable porque Embarcadero usa una convención de nomenclatura consistente para los paquetes runtime.

Nota: La detección se basa en la presencia de al menos un BPL con un patrón reconocible. Las aplicaciones compiladas con enlace runtime mostrarán la versión, mientras que las compiladas estáticamente (sin BPL) no mostrarán esta información.

Bypass de Redirección del Sistema de Archivos WOW64:

En Windows de 64 bits, cuando un proceso de 32 bits accede a C:\Windows\System32, Windows redirige automáticamente a C:\Windows\SysWOW64. Esta virtualización puede hacer compleja la depuración.

WinInspector 2.1 usa GetModuleFileNameEx() para evitar esta redirección y mostrar las rutas reales:

function GetRealModulePath(ProcessHandle: THandle;
                          ModuleHandle: HMODULE): string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  // Esto devuelve la ruta REAL, no la redirigida
  GetModuleFileNameEx(ProcessHandle, ModuleHandle, Buffer, MAX_PATH);
  Result := string(Buffer);
end;

Los procesos de 32 bits muestran correctamente C:\Windows\SysWOW64\kernel32.dll en lugar de la ruta virtualizada System32, proporcionando información precisa para la resolución de problemas de despliegue.

Optimización de Carga Diferida:

El inspector de DLL se ejecuta solo cuando la pestaña “DLL/Libraries” está activa, manteniendo alto rendimiento para la inspección de la ventana principal.

⏸️ Auto-Pausa: Mejora de Usabilidad

Cuando el mouse se mueve sobre WinInspector para desplazarse por listas largas, el temporizador de actualización automática puede restablecer la posición de desplazamiento.

Solución Implementada:

WinInspector 2.1 detecta cuando el mouse está sobre su propia ventana y pausa automáticamente las actualizaciones, permitiendo desplazarse y analizar datos sin interrupciones.

Retroalimentación Visual:

Un panel de estado en la parte superior indica el estado actual:

  • PAUSADO: Fondo rojo cuando el mouse está sobre WinInspector

    • Mensaje: “⏸️ PAUSED - Mouse over WinInspector (move mouse away to resume)”
  • ACTIVO: Fondo verde durante la inspección

    • Mensaje: “▶️ Inspecting: explorer.exe (PID: 1234)”

Esta funcionalidad mejora la experiencia del usuario al permitir la lectura sin interferencias de las actualizaciones automáticas.

🎯 Interfaz con Pestañas

Para gestionar las nuevas funcionalidades, la versión 2.1 introduce una interfaz organizada con pestañas:

Pestaña 1: Window Info

  • Posición del mouse y detalles de la ventana actual
  • Jerarquía completa de ventanas: cadena completa desde el control bajo el mouse hasta la ventana raíz, mostrando todos los niveles de anidamiento con handle, clase y título para cada nivel
  • Análisis de componentes VCL
  • Información del monitor

Pestaña 2: DLL/Libraries

  • Enumeración completa de DLL
  • Detección de paquetes BPL
  • Información de versión
  • Todas las bibliotecas cargadas con rutas completas

Casos de Uso

Las nuevas funcionalidades resultan útiles en diversos escenarios:

Depuración de Formularios VCL en Tiempo de Ejecución

Para resolver comportamientos anormales en producción sin recurrir a un depurador:

  1. Ejecutar WinInspector
  2. Posicionar el mouse sobre el componente en cuestión
  3. Verificar el estado en tiempo real: Checked, Enabled, contenedor padre
  4. Comparar con las expectativas

Este enfoque no requiere sesiones de depuración, modificaciones de código o reinicios de aplicación.

Análisis de Dependencias DLL

Para diagnosticar problemas de ejecución relacionados con incompatibilidades de versiones de bibliotecas:

  1. Ejecutar WinInspector en la máquina cliente
  2. Acceder a la pestaña DLL/Libraries
  3. Analizar la lista completa de DLL cargadas
  4. Comparar con el entorno de desarrollo

Este proceso puede revelar discrepancias en las versiones de bibliotecas, como msvcr140.dll v14.0.24215 en producción versus v14.0.27508 en el entorno de prueba.

Análisis de Estructura de UI

Para comprender la arquitectura de interfaces complejas:

  1. Posicionar el mouse sobre los controles con WinInspector
  2. Examinar la jerarquía completa desde el control hasta el formulario raíz
  3. Identificar tipos de componentes y patrones de anidamiento
  4. Analizar dimensiones y posicionamiento de contenedores

Útil para aprender patrones de diseño de UI y para refactorizar aplicaciones heredadas.

Detalles Técnicos

WinInspector está implementado en Delphi usando directamente las APIs de Windows. Algunos aspectos técnicos relevantes:

  • Comunicación cross-process: SendMessage y SendMessageTimeout para consultar controles externos
  • Carga diferida: La enumeración de DLL ocurre solo cuando la pestaña correspondiente está activa
  • Gestión de errores robusta: Todos los puntos de fallo potenciales están protegidos con try/except
  • Rendimiento: Temporizador de 500ms con auto-pausa cuando el mouse está sobre WinInspector

Desarrollos Futuros

Algunas funcionalidades en consideración para futuras versiones:

  • Message Spy: Registro en tiempo real de mensajes de Windows enviados a una ventana
  • Soporte de Hotkey: Capturar información de ventana con Ctrl+Shift+I sin cambiar el foco
  • Style Inspector: Detección y análisis de VCL Styles e información de tema
  • Funciones de Exportación: Guardar listas de DLL y jerarquías de ventanas en archivos
  • Historial: Seguimiento de ventanas inspeccionadas recientemente

La versión 2.1 representa un avance significativo en términos de funcionalidad y confiabilidad.

Evolución de la Herramienta

El concepto básico de TDWinInfo de 2001 permanece sin cambios: mueve el mouse, obtén información. Sin embargo, la implementación ha evolucionado considerablemente.

De una simple utilidad, WinInspector se ha convertido en una herramienta de desarrollo profesional con la versión 2.1.

Para la Comunidad Delphi

Las funcionalidades han sido diseñadas específicamente para el ecosistema Delphi y C++Builder:

  • Detección de componentes VCL mediante validación comportamental
  • Análisis de paquetes BPL con identificación heurística de versión
  • Jerarquía completa de ventanas para análisis estructural
  • Inspección cross-process mediante mensajes de Windows API

Una herramienta útil para desarrolladores de aplicaciones Windows usando Delphi o C++Builder.

Descarga y Contribuciones

WinInspector 2.1 está disponible en GitHub:

github.com/danieleteti/wininspector

El proyecto es de código abierto (licencia Apache 2.0), y las contribuciones son bienvenidas. La base de código está documentada y puede servir como referencia para la programación de Windows API en Delphi.

Conclusiones

El desarrollo de WinInspector demuestra las capacidades de Delphi para el desarrollo de escritorio Windows: acceso directo a API, framework VCL estable y alta productividad.

Se agradecen comentarios, solicitudes de funcionalidades y reportes de errores. La herramienta se desarrolla en función de las necesidades de los desarrolladores que la utilizan.


WinInspector 2.1 está disponible en GitHub: github.com/danieleteti/wininspector

Agradecimientos a todos los desarrolladores que proporcionaron comentarios y sugerencias para este lanzamiento.

Comments

comments powered by Disqus