WinInspector 2.1: Nuove Funzionalità Avanzate per Sviluppatori Delphi
Qualche mese fa ho rilasciato WinInspector, il successore spirituale del mio TDWinInfo di 20 anni fa. La risposta della community è stata positiva, e diversi sviluppatori hanno segnalato richieste di funzionalità e suggerimenti. WinInspector 2.1 introduce nuove funzionalità progettate specificamente per sviluppatori Delphi e C++Builder.
Novità della Versione 2.1
Questa versione trasforma WinInspector in un toolkit di analisi completo per sviluppatori Windows. Le principali aggiunte sono le seguenti.
🎨 VCL Component Inspector: Validazione Comportamentale
Il VCL Component Inspector identifica componenti VCL/FMX in applicazioni Delphi e C++Builder utilizzando un approccio di validazione comportamentale invece di affidarsi esclusivamente ai nomi delle classi.
Il Problema dei Nomi di Classe:
I nomi delle classi Windows (ottenuti tramite GetClassName) possono essere ambigui o generici. Un controllo che si chiama “TCheckBox” potrebbe non essere realmente un checkbox VCL, ma un controllo custom con nome simile.
La Soluzione: Validazione Tramite Messaggi Windows:
WinInspector verifica l’identità dei controlli inviando messaggi Windows specifici e analizzando le risposte. Se un controllo risponde correttamente ai messaggi tipici del suo tipo, viene considerato validato.
// Esempio: Verifica se è davvero un checkbox
var CheckState := SendMessage(Handle, BM_GETCHECK, 0, 0);
case CheckState of
BST_UNCHECKED: // Risponde come checkbox → validato
BST_CHECKED: // Risponde come checkbox → validato
BST_INDETERMINATE: // Checkbox a tre stati → validato
end;
Messaggi di Validazione per Tipo:
- CheckBox/RadioButton:
BM_GETCHECKper verificare la capacità di gestire stati checked/unchecked - ListBox/ComboBox:
LB_GETCOUNT/CB_GETCOUNTper confermare la gestione di liste di item - Edit/Memo: Verifica degli style flags (
ES_READONLY,ES_MULTILINE,ES_PASSWORD) - Button: Analisi style per rilevare pulsanti predefiniti (
BS_DEFPUSHBUTTON)
Perché Questo Approccio è Superiore:
- Certezza del tipo: Non ci fidiamo solo del nome, ma verifichiamo che il controllo si comporti effettivamente come dovrebbe
- Cross-process: Funziona tramite messaggi Windows API, senza bisogno di RTTI (limitato a in-process)
- Robustezza: Se un controllo non risponde ai messaggi attesi, viene semplicemente escluso dall’analisi VCL
- Compatibilità: Funziona su qualsiasi applicazione Delphi/C++Builder esterna, anche in produzione
Questo metodo di validazione comportamentale garantisce che WinInspector identifichi solo componenti VCL autentici, evitando falsi positivi.
🔗 Gerarchia Completa delle Finestre
Una delle funzionalità più utili di WinInspector 2.1 è la visualizzazione della gerarchia completa delle finestre. Quando si posiziona il mouse su un controllo, il tool non mostra solo il controllo corrente, ma l’intera catena di parent fino alla finestra root.
Perché è importante:
Nelle applicazioni VCL/FMX complesse, i controlli sono spesso annidati in più livelli di container (Panel, GroupBox, TabSheet, ecc.). Comprendere questa struttura è fondamentale per:
- Debug di problemi di layout e posizionamento
- Analisi della struttura UI di applicazioni terze
- Comprensione dell’architettura dei form complessi
- Identificazione del contesto di un controllo
Esempio di output:
📊 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 gerarchia mostra per ogni livello:
- Numero di livello
[0],[1],[2]… dal controllo alla root - Handle della finestra in formato esadecimale
- Classe del controllo (TButton, TPanel, TForm, ecc.)
- Titolo/Caption della finestra (se presente)
- Indentazione visiva che evidenzia la profondità di annidamento

Questa visualizzazione rende immediatamente chiara la struttura gerarchica dell’interfaccia, permettendo di comprendere in quale contesto si trova un controllo specifico.
📚 DLL/Library Inspector: Analisi delle Dipendenze
Il DLL Inspector fornisce informazioni dettagliate sulle librerie caricate da un’applicazione, facilitando il troubleshooting delle dipendenze e dei problemi di deployment.
Caratteristiche Principali:
Enumerazione Completa:
- Elenca tutte le DLL caricate dal processo
- Path completi per ogni libreria
- Estrazione informazioni versione file
- Ordinamento alfabetico

Rilevamento Euristico della Versione Delphi/C++Builder:
WinInspector identifica automaticamente la versione di Delphi o C++Builder analizzando i package BPL caricati. Il rilevamento è euristico e si basa sui numeri di versione embedded nei nomi dei file BPL.
Ogni versione di Delphi usa un numero di package specifico:
rtl370.bpl,vcl370.bpl→ Delphi 13 Florencertl290.bpl,vcl290.bpl→ Delphi 12 Athensrtl280.bpl,vcl280.bpl→ Delphi 11 Alexandriartl270.bpl,vcl270.bpl→ Delphi 10.4 Sydneyrtl260.bpl→ Delphi 10.3 Rio- E così via fino a XE2 (160)
Il tool cerca questi pattern numerici (370, 290, 280, ecc.) nei nomi dei file BPL e mappa automaticamente alla versione corrispondente. Questo approccio euristico è affidabile perché Embarcadero usa una convenzione di naming consistente per i package runtime.
Nota: Il rilevamento si basa sulla presenza di almeno un BPL con pattern riconoscibile. Applicazioni compilate con runtime linking mostreranno la versione, mentre quelle compilate staticamente (senza BPL) non mostreranno questa informazione.
Bypass Redirezione File System WOW64:
Su Windows 64-bit, quando un processo 32-bit accede a C:\Windows\System32, Windows redirige automaticamente a C:\Windows\SysWOW64. Questa virtualizzazione può rendere complesso il debugging.
WinInspector 2.1 usa GetModuleFileNameEx() per bypassare questa redirezione e mostrare i path effettivi:
function GetRealModulePath(ProcessHandle: THandle;
ModuleHandle: HMODULE): string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
// Questo ritorna il path REALE, non quello rediretto
GetModuleFileNameEx(ProcessHandle, ModuleHandle, Buffer, MAX_PATH);
Result := string(Buffer);
end;
I processi 32-bit mostrano correttamente C:\Windows\SysWOW64\kernel32.dll invece del path virtualizzato System32, fornendo informazioni accurate per il troubleshooting di deployment.
Ottimizzazione Lazy Loading:
Il DLL inspector viene eseguito solo quando il tab “DLL/Libraries” è attivo, mantenendo elevate le prestazioni dell’ispezione della finestra principale.
⏸️ Auto-Pausa: Miglioramento dell’Usabilità
Quando il mouse si sposta su WinInspector per scorrere liste lunghe, il timer di aggiornamento automatico può resettare la posizione di scroll.
Soluzione implementata:
WinInspector 2.1 rileva quando il mouse è sulla propria finestra e mette automaticamente in pausa gli aggiornamenti, permettendo di scorrere e analizzare i dati senza interruzioni.
Feedback Visivo:
Un pannello di stato in alto indica lo stato corrente:
-
IN PAUSA: Sfondo rosso quando il mouse è su WinInspector
- Messaggio: “⏸️ PAUSED - Mouse over WinInspector (move mouse away to resume)”
-
ATTIVO: Sfondo verde durante l’ispezione
- Messaggio: “▶️ Inspecting: explorer.exe (PID: 1234)”
Questa funzionalità migliora l’esperienza utente consentendo la lettura senza interferenze dagli aggiornamenti automatici.
🎯 Interfaccia a Tab
Per gestire le nuove funzionalità, la versione 2.1 introduce un’interfaccia organizzata con tab:
Tab 1: Window Info
- Posizione mouse e dettagli finestra corrente
- Gerarchia completa delle finestre: catena completa dal controllo sotto il mouse fino alla finestra root, mostrando tutti i livelli di annidamento con handle, classe e titolo per ogni livello
- Analisi componenti VCL
- Informazioni monitor
Tab 2: DLL/Libraries
- Enumerazione completa DLL
- Rilevamento package BPL
- Informazioni versione
- Tutte le librerie caricate con path completi
Casi d’Uso
Le nuove funzionalità si rivelano utili in diversi scenari:
Debug Form VCL a Runtime
Per il troubleshooting di comportamenti anomali in produzione senza ricorrere al debugger:
- Eseguire WinInspector
- Posizionare il mouse sul componente in questione
- Verificare lo stato real-time: Checked, Enabled, parent container
- Confrontare con le aspettative
Questo approccio non richiede sessioni di debug, modifiche al codice o restart dell’applicazione.
Analisi delle Dipendenze DLL
Per diagnosticare problemi di esecuzione legati a incompatibilità di versioni delle librerie:
- Eseguire WinInspector sulla macchina cliente
- Accedere al tab DLL/Libraries
- Analizzare la lista completa delle DLL caricate
- Confrontare con l’ambiente di sviluppo
Questo processo può rivelare discrepanze nelle versioni delle librerie, come ad esempio msvcr140.dll v14.0.24215 in produzione contro v14.0.27508 nell’ambiente di test.
Analisi Struttura UI
Per comprendere l’architettura di interfacce complesse:
- Posizionare il mouse sui controlli con WinInspector
- Esaminare la gerarchia completa dal controllo alla form root
- Identificare i tipi di componenti e i pattern di annidamento
- Analizzare le dimensioni e il posizionamento dei container
Utile per apprendere pattern di design UI e per il refactoring di applicazioni legacy.
Dettagli Tecnici
WinInspector è implementato in Delphi usando direttamente le Windows API. Alcuni aspetti tecnici rilevanti:
- Comunicazione cross-process:
SendMessageeSendMessageTimeoutper interrogare controlli esterni - Lazy loading: L’enumerazione DLL avviene solo quando il tab corrispondente è attivo
- Gestione errori robusta: Tutti i potenziali punti di fallimento sono protetti con try/except
- Performance: Timer a 500ms con auto-pausa quando il mouse è sopra WinInspector
Sviluppi Futuri
Alcune funzionalità in considerazione per le prossime versioni:
- Message Spy: Logging real-time dei messaggi Windows inviati a una finestra
- Supporto Hotkey: Cattura informazioni finestra con Ctrl+Shift+I senza cambiare focus
- Style Inspector: Rilevamento e analisi VCL Styles e informazioni tema
- Funzioni Export: Salvataggio liste DLL e gerarchie finestre su file
- History: Tracciamento delle ultime finestre ispezionate
La versione 2.1 rappresenta un significativo avanzamento in termini di funzionalità e affidabilità.
Evoluzione dello Strumento
Il concetto di base di TDWinInfo del 2001 rimane invariato: muovi il mouse, ottieni informazioni. L’implementazione si è tuttavia evoluta considerevolmente.
Da semplice utility, WinInspector è diventato uno strumento di sviluppo professionale con la versione 2.1.
Per la Community Delphi
Le funzionalità sono state progettate specificamente per l’ecosistema Delphi e C++Builder:
- Rilevamento componenti VCL tramite validazione comportamentale
- Analisi package BPL con identificazione euristica della versione
- Gerarchia completa delle finestre per analisi strutturale
- Ispezione cross-process tramite messaggi Windows API
Uno strumento utile per sviluppatori di applicazioni Windows con Delphi o C++Builder.
Download e Contributi
WinInspector 2.1 è disponibile su GitHub:
github.com/danieleteti/wininspector
Il progetto è open source (licenza Apache 2.0), e i contributi sono benvenuti. Il codebase è documentato e può servire come riferimento per la programmazione Windows API in Delphi.
Conclusioni
Lo sviluppo di WinInspector dimostra le capacità di Delphi per lo sviluppo desktop Windows: accesso diretto alle API, framework VCL stabile, e produttività elevata.
Feedback, richieste di funzionalità e segnalazioni bug sono benvenuti. Il tool viene sviluppato in base alle esigenze degli sviluppatori che lo utilizzano.
WinInspector 2.1 è disponibile su GitHub: github.com/danieleteti/wininspector
Ringraziamenti a tutti gli sviluppatori che hanno fornito feedback e suggerimenti per questo rilascio.
Comments
comments powered by Disqus