2008-10-15 57 views
1

使用「ESRI MapObjects LT2」ActiveX插件的MFC應用程序在關閉它時拋出ASSERT。在cmdtarg.cpp發生 錯誤:ActiveX插件導致ASSERT在VS2008中的應用程序退出時失敗

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

我建立了(天然C++)應用與VC9。 當我用VC6編譯應用程序時,它表現得很好。

這可能是什麼原因?

回答

1

下解決了這個問題對我來說: 在包含控件的窗口,添加的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(); 
} 
3

看起來像引用計數。這個「目標」是否可以被別的東西引用,是不會釋放它的東西?

+0

D'哦!我剛注意到問題上的「參考 - 計數器」標籤。抱歉。 :-( – 2008-10-15 16:39:14

1

使用_ATL_DEBUG_INTERFACES沒有取得任何額外的輸出... 我定義它的stdafx.小時第一線,#pragma once後直接,所以我想這已經夠早的。

也許原因是,我如何使用ActiveX控件:
我不叫我自己AddRef()Release()
MapObjects安裝程序帶有許多包裝類的示例代碼,它們必須由VC6或更早版本生成。
我試圖用VC9自己生成包裝類,但出現了我無法修復的錯誤。 我通過讓我的窗戶中有一個類型爲CMap1(源自CWnd)的成員來使用控件,這是生成的包裝類之一。在CMyWnd::OnCreate()我也叫CMap1::Create()就是這樣,我完成了:我可以添加一個圖層,控件顯示一個世界地圖。
我幾乎不知道什麼引用計數的東西是關於我沒有添加或發佈任何引用。至少不知道...

該控件是相當古老的:.OCX文件在其版本信息中有2000年。
它也不是官方支持,但我沒有任何替代。

相關問題