ActiveXプラグインにより、VS2008でアプリケーションの終了時にASSERTが失敗します

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

質問

「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年が含まれています。
また、公式にはサポートされていませんが、代替物はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top