Pregunta

Mi aplicación MFC que usa el " ESRI MapObjects LT2 " El complemento ActiveX me lanza un ASSERT al cerrarlo. El error ocurre en 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;
}

Construí la aplicación (nativa C ++) con VC9. Cuando compilo la aplicación con VC6, se comporta muy bien.

¿Cuál podría ser la razón de esto?

¿Fue útil?

Solución 4

Lo siguiente lo resolvió para mí: En la ventana que contiene el control, agregue un controlador 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();
}

Otros consejos

Eso parece un recuento de referencia. ¿Podría este " apuntar " ser referenciado por algo más, algo que no lo está liberando?

Puede rastrear las llamadas Addref y Release que definen _ATL_DEBUG_INTERFACES

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

_ATL_DEBUG_INTERFACES

Defina esta macro antes de incluir cualquier archivo de encabezado ATL para rastrear todas las llamadas AddRef y Release en las interfaces de sus componentes a la ventana de salida.

El uso de _ATL_DEBUG_INTERFACES no produjo ningún resultado adicional ... Lo definí en la primera línea de stdafx. h, directamente después de #pragma once , así que supongo que esto es lo suficientemente temprano.

Tal vez la razón es cómo estoy usando el control ActiveX:
No estoy llamando a AddRef () o Release () por mí mismo.
El instalador de MapObjects viene con un código de muestra con muchas clases de contenedor que deben haber sido generadas por VC6 o algo anterior.
Traté de generar clases de envoltura yo mismo con VC9 pero se produjeron errores que no pude corregir. Uso el control al permitir que una de mis ventanas tenga un miembro de tipo CMap1 (derivado de CWnd ), que es una de esas clases de contenedor generadas. En CMyWnd :: OnCreate () también llamo a CMap1 :: Create () y listo, he terminado: puedo agregar una capa y el control muestra un mundo mapa.
No tengo ni idea de qué se trata el recuento de referencias, ya que no he agregado ni publicado ninguna referencia. Al menos no a sabiendas ...

El control es bastante antiguo: el archivo .OCX tiene el año 2000 en su información de versión.
Tampoco es oficialmente compatible, pero no tengo ningún sustituto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top