使用“ESRI MapObjects LT2”的我的MFC应用程序关闭它时,ActiveX插件会向我抛出一个ASSERT。 该错误发生在 cmdtarg.cpp

CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
    if (m_xDispatch.m_vtbl != 0)
        ((COleDispatchImpl*)&m_xDispatch)->Disconnect();
    ASSERT(m_dwRef <= 1); //<--- Fails because m_dwRef is 3
#endif
    m_pModuleState = NULL;
}

我使用VC9构建了(本机C ++)应用程序。 当我使用VC6编译应用程序时,它表现得很好。

这可能是什么原因?

有帮助吗?

解决方案 4

以下为我解决了这个问题: 在包含该控件的窗口中,添加一个OnDestroy()处理程序:

void CMyWnd::OnDestroy()
{
    // Apparently we have to disconnect the (ActiveX) Map control manually
    // with this undocumented method.
    COleControlSite* pSite = GetOleControlSite(MY_DIALOG_CONTROL_ID);
    if(NULL != pSite)
    {
        pSite->ExternalDisconnect();
    }

    CWnd::OnDestroy();
}

其他提示

这看起来像是引用计数。这可能是“目标”吗?被其他东西引用,某些东西没有释放它?

您可以跟踪定义 _ATL_DEBUG_INTERFACES

的Addref和Release调用

来自 http://msdn.microsoft.com /en-us/library/sycfy8ec(VS.80).aspx

_ATL_DEBUG_INTERFACES

在包含任何ATL头文件之前定义此宏,以跟踪组件接口上所有AddRef和Release调用到输出窗口。

使用 _ATL_DEBUG_INTERFACES 没有产生任何额外的输出...... 我在 stdafx。 h的第一行定义了它,直接在 #pragma once 之后,所以我想这已经足够早了。

可能原因是我如何使用ActiveX控件:
我不是自己调用 AddRef() Release()
MapObjects安装程序带有大量包装类的示例代码,这些包装类必须由VC6或之前的东西生成 我试图用VC9自己生成包装类,但是出现了我无法解决的错误。 我通过让我的一个窗口有 CMap1 (来自 CWnd )的成员来使用控件,这是生成的包装类之一。在 CMyWnd :: OnCreate()中我也调用了 CMap1 :: Create(),就这样,我完成了:我可以添加一个图层,控件显示一个世界地图。结果 我几乎不知道引用计数的内容是什么,因为我没有添加或发布任何引用。至少不是故意的......

控件很旧:.OCX文件的版本信息中包含2000年。
它也不再受到官方支持,但我没有任何替代品。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top