Le plugin ActiveX provoque l'échec d'ASSERT à la fermeture d'une application dans VS2008

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

Question

Mon application MFC utilisant le "ESRI MapObjects LT2" Le plugin ActiveX me lance un ASSERT lors de la fermeture. L'erreur se produit dans 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;
}

J'ai construit l'application (C ++ natif) avec VC9. Lorsque je compile l’application avec VC6, elle se comporte bien.

Quelle pourrait en être la raison?

Était-ce utile?

La solution 4

Ce qui suit l'a résolu pour moi: Dans la fenêtre qui contient le contrôle, ajoutez un gestionnaire 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();
}

Autres conseils

Cela ressemble à un nombre de références. Est-ce que cette " cible " être référencé par quelque chose d'autre, quelque chose qui ne le libère pas?

Vous pouvez suivre les appels Addref et Release définissant _ATL_DEBUG_INTERFACES

.

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

_ATL_DEBUG_INTERFACES

Définissez cette macro avant d'inclure les fichiers d'en-tête ATL pour tracer tous les appels AddRef et Release sur les interfaces de vos composants vers la fenêtre de sortie.

L'utilisation de _ATL_DEBUG_INTERFACES n'a généré aucun résultat supplémentaire ... Je l'ai défini sur la première ligne de stdafx. h, juste après #pragma une fois , donc je suppose que c'est assez tôt.

La raison en est peut-être la manière dont j'utilise le contrôle ActiveX:
Je n'appelle pas AddRef () ou Release () par moi-même.
Le programme d'installation de MapObjects est fourni avec un exemple de code avec de nombreuses classes wrapper qui doivent avoir été générées par VC6 ou une version antérieure.
J'ai essayé de générer moi-même des classes wrapper avec VC9, mais des erreurs que je n'ai pas pu résoudre sont survenues. J'utilise le contrôle en laissant à l'une de mes fenêtres un membre de type CMap1 (dérivé de CWnd ), qui est l'une de ces classes d'encapsulation générées. Dans CMyWnd :: OnCreate () , j'appelle aussi CMap1 :: Create () et voilà, j'ai terminé: je peux ajouter une couche et le contrôle affiche un monde carte.
Je n'ai pratiquement aucune idée du contenu du comptage de références car je n'ai ni ajouté ni publié de références. Du moins pas sciemment ...

Le contrôle est assez ancien: le fichier .OCX contient l'année 2000 dans ses informations de version.
Il n’est plus officiellement pris en charge, mais je n’ai pas de substitut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top