C# 调用AtlUnadvise后,RefCount保持不变

C# 调用AtlUnadvise后,RefCount保持不变,c#,c++,events,com,C#,C++,Events,Com,我们发现内存泄漏问题,原因是在AtlUnadvise()之后RefCount没有减少 以下是测试代码: void CCppTesterDlg::OnBnClickedTextbtn() { CComObject<CManagedGuiEventSinkImpl> *pEventSink; TestForm::ITestFormPtr pTestFormPtr( __uuidof(TestForm::TestForm) ); //Attach our COM

我们发现内存泄漏问题,原因是在AtlUnadvise()之后RefCount没有减少

以下是测试代码:

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
    }
}
void ccppesterdlg::OnBnClickedTextbtn()
{
c项目*pEventSink;
TestForm::ITestFormPtr pTestFormPtr(u uuidof(TestForm::TestForm));
//将COM事件接收器连接到托管对话框以侦听键盘和鼠标事件
如果(CComObject::CreateInstance(&Peventink)==S_OK)
{
HRESULT hr=S_FALSE;
DWORD dwCookie=0;
CComPtr pSink(pEventSink);//引用计数==1
hr=AtlAdvise(pTestFormPtr、pSink、_uuuIdof(ManagedGuiEventInterface::IManagedGuiEventSink)和dwCookie);
//参考计数==2
//pTestFormPtr->OpenDialog();
//关闭模式对话框后分离事件接收器
hr=AtlUnadvise(pTestFormPtr,u uuidof(ManagedGuiEventInterface::IManagedGuiEventSink),dwCookie);
//参考计数==2
}
}
CManagedGuideventsinkImpl类用于从C#模块获取事件,到目前为止,它可以正常工作,但是我们发现上面的pEventSink对象没有得到正确释放

我在那些课上错过了什么吗

任何参考都将不胜感激,提前感谢

您如何准确地看到托管接口CCW上的引用计数? pEventSink是一个CCombject对象,所以您可以在监视窗口中检查ref count,它不是托管对象

我的朋友刚刚告诉我,FinalRelease()将在调用GC.Collect()后被命中,因此它由.NETGC保存

谢谢大家

您如何准确地看到托管接口CCW上的引用计数? pEventSink是一个CCombject对象,所以您可以在监视窗口中检查ref count,它不是托管对象

我的朋友刚刚告诉我,FinalRelease()将在调用GC.Collect()后被命中,因此它由.NETGC保存


谢谢大家。

-请参阅标题“事件循环引用问题”下的“管理接口CCW上的引用计数”一文?那埋在CLR的深处请参阅标题“事件循环引用IssuesErm”下的内容,您如何准确地看到托管接口CCW上的引用计数?这在CLR里埋得很深。