Bearを使用してユーザーオブジェクトを検査していますが、RemoveWindowSubclassでWindowProcカウントが減少することはありません。タスクマネージャのユーザーオブジェクトであるUSERの合計も同様です。
ウィンドウを破棄する前にサブクラスを削除することについてのレイモンドのより安全なサブクラス化のコメントを読みましたが、私のテストはウィンドウを破棄せずに行われました。
同じサブクラス化APIが、TTF_SUBCLASSされたツールのcomctlのツールチップクラスによって内部的に使用されるため、非協調的なツールチップを使用している場合は、より多くのリークが発生します。
これが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
誰かがコメントを残すことができれば、何が起こっているのか、そしてリークを解決する方法は素晴らしいでしょう。
SetWindowSubclass APIを使用して集中的なサブクラス化を行っている場合は、他の人に警告が表示されます。
乾杯、
</ wqw>