ActiveX 플러그인은 vs2008에서 응용 프로그램 종료시 실패로 인정됩니다.

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

문제

"Esri MapObjects LT2"ActiveX 플러그인을 사용한 MFC 응용 프로그램은 닫을 때 나에게 어필을 던집니다. 오류가 발생합니다 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;
}

VC9로 (기본 C ++) 응용 프로그램을 구축했습니다. VC6으로 응용 프로그램을 컴파일하면 잘 작동합니다.

그 이유는 무엇입니까?

도움이 되었습니까?

해결책 4

다음은 나를 위해 해결했습니다 : 컨트롤이 포함 된 창에서 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();
}

다른 팁

참조 수처럼 보입니다. 이 "대상"이 다른 것에 의해 참조 될 수 있습니까?

AddRef를 추적하고 통화를 정의 할 수 있습니다 _ATL_DEBUG_INTERFACES

~에서 http://msdn.microsoft.com/en-us/library/sycfy8ec(vs.80).aspx

_ATL_DEBUG_INTERFACES

ATL 헤더 파일을 포함시키기 전에이 매크로를 정의하여 모든 AddRef를 추적하고 구성 요소의 인터페이스에서 출력 창으로 릴리스 호출을 릴리스하십시오.

사용 _ATL_DEBUG_INTERFACES 추가 출력을 얻지 못했습니다 ... 첫 번째 줄에 정의했습니다. stdafx.H, 직후 #pragma once 그래서 나는 이것이 충분히 일찍 있다고 생각합니다.

아마도 그 이유는 내가 ActiveX 컨트롤을 사용하는 방법입니다.
나는 전화하지 않는다 AddRef() 또는 Release() 스스로.
MapObjects 설치 프로그램에는 VC6 또는 이전에 생성 된 많은 래퍼 클래스가 포함 된 샘플 코드가 제공됩니다.
VC9로 래퍼 클래스를 직접 생성하려고했지만 수정할 수없는 오류가 발생했습니다. 내 창문 중 하나에 유형의 구성원이 있도록 컨트롤을 사용합니다. CMap1 (로부터 나오다 CWnd), 생성 된 래퍼 클래스 중 하나입니다. ~ 안에 CMyWnd::OnCreate() 나도 전화합니다 CMap1::Create() 그리고 그게 다야, 나는 끝났다 : 나는 레이어를 추가 할 수 있고 컨트롤은 월드 맵을 표시한다.
참조를 추가하거나 공개하지 않았기 때문에 기준 계수가 무엇인지 전혀 모릅니다. 적어도 고의로 ...

컨트롤은 꽤 오래되었습니다. .ocx 파일은 2000 년 버전 정보에 있습니다.
또한 더 이상 공식적으로 지원되지는 않지만 대체물이 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top