Я использую Bear для проверки пользовательских объектов, и счетчик WindowProc никогда не уменьшается при RemoveWindowSubclass. Так же, как и сумма в USER, которая является объектами пользователя в диспетчере задач.
Я прочитал комментарий Раймонда Безопасные подклассы о том, как удалить подклассы перед разрушением окна, но мой тест завершен без его уничтожения.
Тот же API подклассов используется внутренне классом всплывающих подсказок comctl для инструментов TTF_SUBCLASS, поэтому при использовании несовместимых всплывающих подсказок возникает больше утечек.
Вот код 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
Если кто-то может оставить комментарий, что происходит и как устранить утечки, будет здорово.
Кто-нибудь еще будет предупрежден, если вы делаете интенсивное создание подклассов с помощью API SetWindowSubclass.
ура