Domanda

Orso di ispezionare oggetti utente e il conteggio WindowProc è mai diminuendo su RemoveWindowSubclass. Così fa il totale in USER che è gli oggetti utente in Task Manager.

Safer sottoclassi di Raymond commentare rimozione sottoclassi prima di distruggere la finestra, ma la mia prova è fatto w / o distruggere a tutti.

La stessa API sottoclasse viene utilizzato internamente per classe suggerimento del comctl per strumenti TTF_SUBCLASS'ed, in modo più fughe verificano se si utilizzano i suggerimenti non cooperativi.

Ecco il codice VB6

'--- Form1.frm '
Option Explicit

Private Declare Function SetWindowSubclass Lib "comctl32" (ByVal hwnd As Long, ByVal pfnSubclass As Long, ByVal uIdSubclass As Long, ByVal dwRefData As Long) As Long
Private Declare Function DefSubclassProc Lib "comctl32" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function RemoveWindowSubclass Lib "comctl32" (ByVal hwnd As Long, ByVal pfnSubclass As Long, ByVal uIdSubclass As Long) As Long

Private Sub Command1_Click()
    Call SetWindowSubclass(hwnd, AddressOf RedirectTabPaneEditWndProc, 10, ObjPtr(Me))
End Sub

Private Sub Command2_Click()
    Call RemoveWindowSubclass(hwnd, AddressOf RedirectTabPaneEditWndProc, 10)
End Sub

Friend Function frWndProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    frWndProc = DefSubclassProc(hwnd, wMsg, wParam, lParam)
End Function

'--- Module1.bas '
Option Explicit

Public Function RedirectTabPaneEditWndProc( _
            ByVal hwnd As Long, _
            ByVal wMsg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long, _
            ByVal uIdSubclass As Long, _
            ByVal This As Form1) As Long
    #If uIdSubclass Then '--- touch args
    #End If
    RedirectTabPaneEditWndProc = This.frWndProc(hwnd, wMsg, wParam, lParam)
End Function

Se qualcuno può lasciare un commento quello che sta succedendo e come risolvere le falle sarà grande.

Chiunque altro essere avvertiti se si sta facendo sottoclassi intensivo con SetWindowSubclass API.

applausi,

È stato utile?

Soluzione

Credo che chiamare questa una "fuga" è un po 'iperbolico. È vero, l'oggetto utente non viene ripristinata quando RemoveWindowSubclass viene chiamato, ma nessuno dei due è un altro assegnato quando si chiama SetWindowSubclass di nuovo. È ripetutamente possibile impostare e rimuovere il gancio, e lo stesso oggetto utente sembra essere riutilizzato più e più volte per la durata del processo.

Ho fatto un paio di prove che si è espansa dello scenario più semplice e minuscole. Solo per riferimento sfondo, ogni istanza del modulo con due pulsanti di comando e nessuna finestra ganci consuma sei oggetti utente. Chiamando SetWindowSubclass effettivamente consuma un altro oggetto utente per classe finestra . Cioè, posso caricare più istanze di tale forma, e agganciare il flusso di messaggio per il modulo stesso, nonché i due pulsanti di comando contenute, e consumare un totale di due oggetti Utente. Questi, come si osserva, non vengono riciclati per la durata del processo.

Potrebbe la progettazione interna più pulita? Possibilmente. Poi di nuovo, forse no. Non vedo questo tanto motivo di preoccupazione, a tutti. Una maggiore causa di preoccupazione sarebbe un'applicazione progettata in modo tale che questo potrebbero essere preoccupante. In tal caso, un riesame fondamentale del disegno complessivo dell'interfaccia utente può essere in ordine. Io semplicemente non posso immaginare quando si sarebbe sottoclasse così tante classi finestra in un unico processo che questo oggetto in più per ogni classe potrebbe materia.

Altri suggerimenti

Questo è un modo insolito per fare sottoclassi in VB6. Si potrebbe avere più fortuna con SetWindowLong (GWL_WNDPROC) - vedi questo codice VB6 da Karl Peterson.

È interessante notare che sembra che Karl è sperimentando in questo momento con le stesse funzioni che Comctl32 si sta utilizzando. EDIT: sì, è pubblicato un articolo . EDIT: oh, e una risposta a questa domanda :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top