Плагин ActiveX приводит к сбою ASSERT при выходе из приложения в VS2008
-
03-07-2019 - |
Вопрос
Мое приложение MFC, использующее ActiveX-плагин "ESRI MapObjects LT2", выдает мне 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;
}
Я создал приложение (native C ++) с помощью VC9.Когда я компилирую приложение с помощью 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();
}
Другие советы
Это похоже на количество ссылок.Может ли на эту "цель" ссылаться что-то другое, что-то, что не выпускает ее?
Вы можете отследить вызовы Addref и Release, определяющие _ATL_DEBUG_INTERFACES
От http://msdn.microsoft.com/en-us/library/sycfy8ec (ПРОТИВ 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 год.
Он также официально больше не поддерживается, но у меня нет никакой замены.