Il plug-in ActiveX causa il fallimento di ASSERT all'uscita dall'applicazione in VS2008
-
03-07-2019 - |
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ò?
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.