ActiveX 플러그인은 vs2008에서 응용 프로그램 종료시 실패로 인정됩니다.
-
03-07-2019 - |
문제
"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 년 버전 정보에 있습니다.
또한 더 이상 공식적으로 지원되지는 않지만 대체물이 없습니다.