ActiveX-Plugin verursacht ASSERT auf das Beenden der Anwendung in VS2008 zum Scheitern verurteilt

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

Frage

Meine MFC-Anwendung, die „ESRI MapObjects LT2“ ActiveX-Plugin wirft bei mir eine ASSERT, wenn es geschlossen wird. Der Fehler tritt 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;
}

Ich baute die (native C ++) Anwendung mit VC9. Wenn ich die Anwendung mit VC6 kompilieren, es verhält sich gut.

Was ist der Grund dafür sein könnte?

War es hilfreich?

Lösung 4

In der folgenden gelöst es für mich: In dem Fenster, das das Steuerelement enthält, fügen Sie ein OnDestroy () -Prozedur:

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();
}

Andere Tipps

Das sieht aus wie ein Referenzzähler. Könnte das „Ziel“ durch etwas anderes verwiesen werden, etwas, das nicht, es zu veröffentlichen?

Sie können die AddRef verfolgen und Veröffentlichung ruft definieren _ATL_DEBUG_INTERFACES

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

_ATL_DEBUG_INTERFACES

Definieren Sie dieses Makro, bevor Sie ATL-Header-Dateien einschließlich allen AddRef und Release zu verfolgen fordern Ihre Komponenten-Schnittstellen in das Ausgabefenster.

_ATL_DEBUG_INTERFACES Verwendung fand keinen zusätzlichen Ausgang ergibt ... I definierte es in der ersten Zeile von stdafx.h, direkt nach #pragma once also denke ich, dies früh genug ist.

Vielleicht ist der Grund, wie ich das ActiveX-Steuerelement verwenden:
Ich rufe nicht AddRef() oder Release() von mir.
Der MapObjects Installer kommt mit Beispielcode mit vielen Wrapper-Klassen, die früher von VC6 oder etwas erzeugt worden sein.
Ich habe versucht, Wrapperklassen mich mit VC9 zu erzeugen, aber es traten Fehler, die ich nicht in der Lage war, zu beheben. Ich benutze die Steuerung von einem meiner Fenster lassen haben ein Mitglied des Typs CMap1 (von CWnd abgeleitet), die eine dieser erzeugten Wrapper-Klassen ist. In CMyWnd::OnCreate() nenne ich auch CMap1::Create() und das ist es, ich bin fertig. Ich eine Schicht und die Steuer zeigt eine Weltkarte hinzufügen
Ich habe so ziemlich keine Ahnung, was die Referenzzählung Sachen im Begriff ist, wie ich nicht hinzugefügt oder alle Verweise freigegeben wird. Zumindest nicht wissentlich ...

Die Steuerung ist ziemlich alt: Die OCX-Datei hat das Jahr 2000 in der Fassung Informationen
. Es ist auch nicht offiziell unterstützt mehr, aber ich habe keine substitue.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top