ActiveXプラグインにより、VS2008でアプリケーションの終了時にASSERTが失敗します
-
03-07-2019 - |
質問
「ESRI MapObjects LT2」を使用したMFCアプリケーションActiveXプラグインは、閉じるときにASSERTをスローします。
エラーは 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();
}
他のヒント
これは参照カウントのように見えます。これは「ターゲット」になりますか?他の何か、それを解放していない何かによって参照されますか?
_ATL_DEBUG_INTERFACES
を定義するAddrefおよびRelease呼び出しをトレースできます
http://msdn.microsoft.comから/en-us/library/sycfy8ec(VS.80).aspx
_ATL_DEBUG_INTERFACES
ATLヘッダーファイルを含める前にこのマクロを定義して、出力ウィンドウへのコンポーネントのインターフェイス上のすべてのAddRefおよびRelease呼び出しをトレースします。
_ATL_DEBUG_INTERFACES
を使用しても、追加の出力は得られませんでした...
stdafx。
hの最初の行で #pragma once
の直後に定義したので、これは十分早いと思います。
たぶんその理由は、ActiveXコントロールの使用方法です:
自分で AddRef()
や Release()
を呼び出しているわけではありません。
MapObjects Installerには、VC6またはそれ以前のバージョンで生成された多くのラッパークラスを含むサンプルコードが付属しています。
VC9で自分でラッパークラスを生成しようとしましたが、修正できないエラーが発生しました。
私は、ウィンドウの1つに CMap1
( CWnd
から派生)型のメンバーを持たせることでコントロールを使用します。これは、生成されたラッパークラスの1つです。 CMyWnd :: OnCreate()
でも CMap1 :: Create()
を呼び出して、それで終わりです。レイヤーを追加して、コントロールに世界を表示できます地図。
参照を追加またはリリースしていないため、参照カウントの内容についてはほとんどわかりません。少なくとも知らないうちに...
コントロールはかなり古いです。.OCXファイルのバージョン情報には2000年が含まれています。
また、公式にはサポートされていませんが、代替物はありません。