Pergunta

aplicativo My MFC usando o plugin "ESRI MapObjects LT2" ActiveX lança uma ASSERT para mim quando fechá-lo. O erro ocorre no 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;
}

I construído a (C ++ nativo) aplicação com VC9. Quando eu compilar o aplicativo com VC6, ele se comporta muito bem.

O que poderia ser a razão para isso?

Foi útil?

Solução 4

A seguir resolvido para mim: Na janela que contém o controle, adicionar um manipulador de 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();
}

Outras dicas

que se parece com uma contagem de referência. Poderia este "target" ser referenciado por outra coisa, algo que não é liberá-lo?

Você pode rastrear o Addref and Release chamadas definindo _ATL_DEBUG_INTERFACES

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

_ATL_DEBUG_INTERFACES

Definir esta macro antes de incluir quaisquer arquivos de cabeçalho ATL para rastrear todas as chamadas AddRef e Versão na interface de seus componentes para a janela de saída.

Usando _ATL_DEBUG_INTERFACES não deu qualquer produção adicional ... I definiu na primeira linha de stdafx.h, diretamente após #pragma once então eu acho que isso é suficiente cedo.

Talvez a razão é como eu estou usando o controle ActiveX:
Não estou pedindo AddRef() ou Release() por mim.
O MapObjects Installer vem com código de exemplo com muitas classes de mensagens publicitárias que devem ter sido gerados por VC6 ou algo assim antes.
Tentei gerar invólucro aulas me com VC9 mas não ocorreu erros que eu não era capaz de corrigir. Eu uso o controle, deixando uma das minhas janelas têm um membro do tipo CMap1 (derivado de CWnd), que é um daqueles gerados invólucro classes. Em CMyWnd::OnCreate() Apelo também CMap1::Create() e é isso, estou acabado: eu posso adicionar uma camada e o controle exibe um mapa
. Eu tenho praticamente nenhuma ideia do que o material de referência-contagem é sobre como eu não tiver adicionado ou liberado quaisquer referências. Pelo menos não conscientemente ...

O controle é muito velho: O arquivo .ocx tem o ano de 2000 na sua versão informações
. Também não é oficialmente suportado mais, mas eu não tenho nenhuma substitue.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top