Domanda

La mia applicazione MFC utilizzando " ESRI MapObjects LT2 " Il plugin ActiveX mi lancia un ASSERT quando lo chiude. L'errore si verifica in 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;
}

Ho creato l'applicazione (nativa C ++) con VC9. Quando compilo l'applicazione con VC6, si comporta bene.

Quale potrebbe essere la ragione di ciò?

È stato utile?

Soluzione 4

Quanto segue mi ha risolto: Nella finestra che contiene il controllo, aggiungi un gestore 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();
}

Altri suggerimenti

Sembra un conteggio dei riferimenti. Potrebbe questo "target" essere referenziato da qualcos'altro, qualcosa che non lo sta rilasciando?

Puoi tracciare le chiamate Addref e Release che definiscono _ATL_DEBUG_INTERFACES

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

_ATL_DEBUG_INTERFACES

Definire questa macro prima di includere qualsiasi file di intestazione ATL per tracciare tutte le chiamate AddRef e Release sulle interfacce dei componenti nella finestra di output.

L'uso di _ATL_DEBUG_INTERFACES non ha prodotto alcun output aggiuntivo ... L'ho definito sulla prima riga di stdafx. h, subito dopo #pragma una volta quindi immagino che sia abbastanza presto.

Forse il motivo è come sto usando il controllo ActiveX:
Non sto chiamando AddRef () o Release () da solo.
MapObjects Installer viene fornito con un codice di esempio con molte classi wrapper che devono essere state generate da VC6 o qualcosa del genere.
Ho provato a generare classi wrapper con VC9 ma si sono verificati errori che non sono stato in grado di correggere. Uso il controllo lasciando a una delle mie finestre un membro di tipo CMap1 (derivato da CWnd ), che è una di quelle classi wrapper generate. In CMyWnd :: OnCreate () chiamo anche CMap1 :: Create () e il gioco è fatto: posso aggiungere un livello e il controllo visualizza un mondo mappa.
Praticamente non ho idea di cosa trattino i riferimenti, dato che non ho aggiunto o rilasciato alcun riferimento. Almeno non consapevolmente ...

Il controllo è piuttosto vecchio: il file .OCX ha le informazioni sulla versione dell'anno 2000.
Inoltre, non è più ufficialmente supportato ma non ho alcun sostituto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top