1

「ESRIMapObjectsLT2」ActiveXプラグインを使用しているMFCアプリケーションは、閉じるときに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

4 に答える 4

3

定義する Addref および Release 呼び出しをトレースできます。_ATL_DEBUG_INTERFACES

http://msdn.microsoft.com/en-us/library/sycfy8ec(VS.80).aspxから

_ATL_DEBUG_INTERFACES

ATL ヘッダー ファイルをインクルードする前にこのマクロを定義して、コンポーネントの出力ウィンドウへのインターフェイスでのすべての AddRef および Release 呼び出しをトレースします。

于 2008-10-15T17:25:12.677 に答える
3

それは参照カウントのように見えます。この「ターゲット」は、それを解放していない何か他のものによって参照される可能性がありますか?

于 2008-10-15T16:38:30.040 に答える
1

を使用_ATL_DEBUG_INTERFACESしても追加の出力は得られませんでした... stdafx.h の最初の行の直後に定義した#pragma onceので、これは十分早いと思います。


多分その理由は、私が ActiveX コントロールをどのように使用しているかにあるのでしょAddRef()Release()
MapObjects インストーラーには、VC6 以前で生成されたはずの多数のラッパー クラスを含むサンプル コードが付属しています。
VC9 で自分でラッパー クラスを生成しようとしましたが、修正できないエラーが発生しました。ウィンドウの1 つに、生成されたラッパー クラスの 1 つであるタイプCMap1(から派生)のメンバーを持たせることで、コントロールを使用します。I also call and that's it CWnd, I was finished: レイヤーを追加すると、コントロールに世界地図が表示されます。 参照を追加またはリリースしていないため、参照カウントが何であるかはほとんどわかりません。少なくとも無意識に…CMyWnd::OnCreate()CMap1::Create()

コントロールはかなり古いものです。.OCX ファイルのバージョン情報には 2000 年が含まれています。
また、公式にはサポートされていませんが、代替品はありません。

于 2008-10-15T18:37:35.230 に答える
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();
}
于 2009-04-24T10:22:59.923 に答える