AtlUnadvise致电后,RefCount保持不变

时间:2012-04-27 04:37:32

标签: c# c++ events com

我们发现由于RefCount导致的内存泄漏问题在AtlUnadvise()之后没有减少。

这是测试代码:

void CCppTesterDlg::OnBnClickedTextbtn()
{
    CComObject<CManagedGuiEventSinkImpl> *pEventSink;
    TestForm::ITestFormPtr pTestFormPtr( __uuidof(TestForm::TestForm) );

    //Attach our COM event sink to the managed dialog to listen for keyboard and mouse events
    if( CComObject<CManagedGuiEventSinkImpl>::CreateInstance(&pEventSink) == S_OK )
    {
        HRESULT hr = S_FALSE;
        DWORD   dwCookie = 0;
        CComPtr<ManagedGuiEventInterface::IManagedGuiEventSink> pSink( pEventSink );  // ref count == 1

        hr = AtlAdvise( pTestFormPtr, pSink, __uuidof(ManagedGuiEventInterface::IManagedGuiEventSink), &dwCookie );
        // ref count == 2

        //pTestFormPtr->OpenDialog();

        //Detach the event sink after the modal dialog has been closed
        hr = AtlUnadvise( pTestFormPtr, __uuidof(ManagedGuiEventInterface::IManagedGuiEventSink), dwCookie );
        // ref count == 2
    }
}

CManagedGuiEventSinkImpl类用于从C#模块获取事件,到目前为止它可以工作,但是我们发现上面的pEventSink对象没有正确发布。

这些课程中是否有我遗漏的东西?

任何参考将被提前感谢。

1 个答案:

答案 0 :(得分:0)

  
    

您究竟如何看待托管界面的CCW上的引用计数?     pEventSink是一个CComObject对象,因此您可以在监视窗口中检查引用计数,它不是托管对象。

  

我的朋友刚刚告诉我,GC.Collect()被调用后会触发FinalRelease(),所以它由.net GC控制。

谢谢大家。