Una particolare applicazione VCL si arresta in modo anomalo, raramente e apparentemente in modo spontaneo e sospetto fortemente che ciò avvenga perché l'handle della finestra del form principale viene ricreato in risposta a un trigger esterno dal sistema operativo.Quali eventi esterni attivano TCustomForm.RecreateWnd?
Io so per certo che se l'handle della finestra della maschera principale dovessero cambiare, quindi i problemi sarebbero sicuramente seguiti (perché i thread in background inviano messaggi a questo handle).
Ma mi piacerebbe sapere come riprodurre questo errore prima di impostare modifiche al codice per risolverlo, se solo così posso confermare che questa è una causa plausibile degli arresti anomali, che i sintomi corrispondono a quelli riportati, e che le modifiche al codice lo risolvano davvero. (Anche se non v'è alcun modo il sistema operativo può innescare una chiamata a TCustomForm.RecreateWnd
Ho bisogno di trovare qualche altra spiegazione per il crash. Sì, ho potuto inviare CM_RECREATEWND
al form principale, ma che appena fa sorgere una domanda.)
(I Sono consapevole del fatto che il modo corretto per inviare messaggi dai thread in background al thread VCL è creare una finestra di messaggio nascosta esclusivamente a questo scopo usando AllocateHWnd
- questa è la mia proposta di correzione.
Ho visto un errore simile con un discendente di TCustomListView
dove RecreateWnd
veniva attivato modificando lo stile del desktop da Windows XP a Windows Classic. Ma non sono ancora riuscito a trovare un tale metodo per attivare RecreateWnd
su un TCustomForm
. (Ho passato una notevole quantità di tempo a leggere attraverso il codice VCL e devo essere perso qualcosa.)
Sommario:
In quali stimoli dal sistema operativo non la VCL finiscono per chiamare RecreateWnd
su un TCustomForm
? (Sono particolarmente interessato a Windows 7 se questo fa la differenza.)
Se c'è un tale stimolo dal sistema operativo, posso provare se provoca i sintomi osservati. Se non c'è definitivamente, allora posso provare che la ricreazione in una finestra non è la causa.
Non riesco a eseguire il backup, ma ho visto cambiare l'handle della finestra ogni volta che viene applicato un altro stile VCL. –
Dai un'occhiata al codice sorgente per la vcl. Ecco dove vorrei iniziare –
@DavidHeffernan Ho già trascorso l'intera mattinata a leggere la fonte VCL e mi manca qualcosa o il sistema operativo non attiva RecreateWnd sui moduli. Speravo che qualcuno potesse conoscere la risposta. –