2014-12-10 18 views
7

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.

+0

Non riesco a eseguire il backup, ma ho visto cambiare l'handle della finestra ogni volta che viene applicato un altro stile VCL. –

+0

Dai un'occhiata al codice sorgente per la vcl. Ecco dove vorrei iniziare –

+0

@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. –

risposta

1

Windows distruggerà il modulo se è di proprietà o padre di un'altra finestra che viene distrutta.

Ciò causerà la distruzione dell'impugnatura del modulo.

Ma dal momento che il modulo è ancora in giro, Delphi ricreerà l'handle la volta successiva.

+0

Buon punto. Questo meccanismo non sarebbe esplicito come tale nella sorgente VCL. Cosa succede se il modulo proprietario era l'oggetto dell'applicazione Delphi? Immagino che * non * venga distrutto e ricreato durante la normale durata del processo. –

+0

@IanGoldby Questo è vero. Windows non è mai in grado di chiamare 'RecreateWnd'. Questo metodo viene chiamato internamente quando è necessario ricreare l'handle della finestra. Il codice sorgente VCL è pieno di situazioni in cui è necessario ricreare il manico di un form (ad es. Si modificano 'FormStyle',' BorderStyle', 'BiDiMode',' BorderIcons', 'Position'. Ma in tutti questi casi , è lo stesso VCL a farlo. –

+0

Il punto cruciale è che è il VCL a farlo * in risposta a qualcosa nel codice dell'applicazione dello sviluppatore * piuttosto che in risposta a qualcosa che accade esternamente (come l'utente che cambia lo stile del desktop –

Problemi correlati