J'utilise Bear pour inspecter des objets utilisateur et le nombre de WindowProc ne diminue jamais lors de RemoveWindowSubclass. Tout comme le total dans USER qui est les objets utilisateur dans le Gestionnaire des tâches.SetWindowSubclass fuit des objets utilisateur
J'ai lu le commentaire Safer subclassing de Raymond sur la suppression de la sous-classe avant de détruire la fenêtre, mais mon test est fait sans la détruire du tout.
La même API de sous-classe est utilisée en interne par la classe d'info-bulles de comctl pour les outils TTF_SUBCLASS, ce qui entraîne d'autres fuites si vous utilisez des info-bulles non coopératives.
Voici le code 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
Si peut laisser un commentaire ce qui se passe et comment résoudre les fuites sera grande. N'importe qui d'autre être averti si vous faites un sous-classement intensif avec l'API SetWindowSubclass
acclamations,
</wqw >
Le nombre total de fenêtres sous-classées à tout moment peut ne pas être si élevé. C'est la période de quelques jours pendant laquelle les formulaires sont chargés/sous-classés/déchargés que ces fuites s'accumulent. La plupart des fuites de GDI sont comme ceci, empoisonnant lentement le processus jusqu'à ce que l'exécution de VB se plaint "ne peut pas charger le contrôle" ou "mémoire insuffisante". – wqw
Essayez ce que j'ai fait. Charger, sous-classe, décharger, répéter.Vous prenez le hit sur la classe de fenêtre initiale, pas sur chaque fenêtre. Combien de classes de fenêtres envisagez-vous de sous-classer? (Vous savez ce qu'est une classe de fenêtre, n'est-ce pas?) –
Cet emplacement de sous-classe filtré ne correspond pas à la classe de la fenêtre, comme vous le supposez, mais à l'adresse wndproc. Donc, si vous utilisez PushParamThunk de Matt Curland qui génère un stub d'assemblage pour sous-classer un formulaire (nouveau stub sur chaque instance de sous-classe) et quelqu'un (comme les info-bulles comctl32) utilisez SetWindowSubclass pour sous-classer le même hwnd, même si le nom de la classe ne change pas ('ThunderRT6Form') un emplacement de sous-classement est alloué parce que l'adresse wndproc ne peut être trouvée dans aucun emplacement précédent. Je suis positif sur mes observations (Bear' et accidents) mais vous aurez besoin de quelqu'un de MS pour confirmer mon explication. – wqw