Плагин ActiveX вызывает сбой ASSERT при выходе из приложения в VS2008 - PullRequest
1 голос
/ 15 октября 2008

Мое приложение 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;
}

Я создал (родной C ++) приложение с VC9. Когда я компилирую приложение с VC6, оно ведет себя хорошо.

В чем может быть причина этого?

Ответы [ 4 ]

3 голосов
/ 15 октября 2008

Вы можете отслеживать вызовы Addref и Release, определяя _ATL_DEBUG_INTERFACES

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

_ATL_DEBUG_INTERFACES

Определите этот макрос, прежде чем включать любые заголовочные файлы ATL для отслеживания всех вызовов AddRef и Release на интерфейсах ваших компонентов в окне вывода.

3 голосов
/ 15 октября 2008

Это похоже на счетчик ссылок. Может ли на эту «цель» ссылаться что-то еще, что-то, что ее не выпускает?

1 голос
/ 24 апреля 2009

Следующее решило это для меня: В окне, содержащем элемент управления, добавьте обработчик 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();
}
1 голос
/ 15 октября 2008

Использование _ATL_DEBUG_INTERFACES не дало никакого дополнительного вывода ... Я определил его в первой строке stdafx. ч, сразу после #pragma once, поэтому я думаю, что это достаточно рано.

Возможно, причина в том, как я использую элемент управления ActiveX:
Я не звоню AddRef() или Release() сам.
Установщик MapObjects поставляется с примером кода со множеством классов-оболочек, которые должны быть сгенерированы VC6 или чем-то более ранним.
Я сам пытался сгенерировать классы-оболочки с помощью VC9, но возникли ошибки, которые я не смог исправить. Я использую элемент управления, позволяя одному из моих окон иметь член типа CMap1 (производный от CWnd), который является одним из этих сгенерированных классов-оболочек. В CMyWnd::OnCreate() я также называю CMap1::Create() и все, я закончил: я могу добавить слой, и элемент управления отображает карту мира.
Я почти не знаю, что такое подсчет ссылок, так как я не добавил и не выпустил никаких ссылок. По крайней мере, не зря ...

Элемент управления довольно старый: у файла .OCX 2000 год в информации о версии.
Это также официально не поддерживается, но у меня нет никакой замены.

...