SetWindowSubclass泄漏用户对象(SetWindowSubclass is leaki

2019-09-30 04:24发布

我用熊来检查用户对象和的WindowProc计数时RemoveWindowSubclass从未减少。 因而总计用户是在任务管理器中的用户对象。

我读雷蒙德的更安全的子类在销毁窗口之前删除的子类评论,但我的测试是W / O都摧毁它。

同样的子类API是由TTF_SUBCLASS'ed工具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>

Answer 1:

我想调用此一“泄漏”是有点夸张。 诚然,没有恢复时RemoveWindowSubclass被调用,但无论是用户对象是另一个当你SetWindowSubclass再次调用分配。 您可以反复设置和删除的钩,并出现同一用户对象的过程中生活被重用一遍又一遍。

我做了一些更多的测试,你的最简单的情况是扩展。 仅供参考背景,与两个命令按钮和无窗钩表单的每个实例消耗六个用户对象。 调用SetWindowSubclass确实消耗每个窗口类多了一个User对象。 也就是说,我可以加载形式的多个实例,并且钩的形式本身以及含有二者的命令按钮的消息流,并消耗总共两个用户对象。 这些,当你观察,不循环的过程中的生活。

可以在内部设计更干净? 有可能。 话又说回来,可能不会。 我不认为这是多令人担忧,在所有。 一个值得关注的更伟大的事业将是一个应用程序设计,使得这可能会涉及。 在这种情况下,整体UI设计的基本复议可能是为了。 我的时候,你会在一个单一的过程中,对于每类这些额外的对象可能可能无论是继承这么多窗口类根本无法想象。



Answer 2:

这是做子类在VB6一个不寻常的方式。 你可能有更多的运气与SetWindowLong函数(GWL_WNDPROC) -看到这个VB6代码从卡尔·彼得森。

有趣的是,它看起来像卡尔尝试,现在与你使用相同COMCTL32功能。 编辑:是的,他贴出了一篇文章 。 编辑:哦, 回答这个问题 :)



文章来源: SetWindowSubclass is leaking user objects