ActiveX插件导致ASSERT在VS2008中的应用程序退出时失败
-
03-07-2019 - |
题
使用“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
来自 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年。
它也不再受到官方支持,但我没有任何替代品。