Плагин ActiveX приводит к сбою ASSERT при выходе из приложения в VS2008

StackOverflow https://stackoverflow.com/questions/205270

Вопрос

Мое приложение 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 год.
Он также официально больше не поддерживается, но у меня нет никакой замены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top