المساعد اكتف يتسبب ASSERT فشل على طلب المخرج في VS2008

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

سؤال

وبلدي تطبيق MFC باستخدام البرنامج المساعد "ESRI MapObjects LT2" اكتف يطرح 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;
}

ولقد بنيت التطبيق (الأصلي C ++) مع VC9. عندما كنت ترجمة التطبيق مع 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 لم تسفر عن أي إخراج إضافية ... I تعريفه على السطر الأول من stdafx.h، مباشرة بعد #pragma once ذلك أعتقد أن هذا هو وقت مبكر بما فيه الكفاية.

وربما السبب في ذلك هو كيف أستخدمه عنصر تحكم ActiveX:
أنا لا أدعو AddRef() أو Release() بنفسي.
وMapObjects المثبت يأتي مع نموذج التعليمات البرمجية مع الكثير من فئات المجمع الذي يجب أن يكون قد تم إنشاؤها بواسطة VC6 أو شيء في وقت سابق.
حاولت لإنشاء فئات المجمع نفسي مع VC9 لكن حدث هناك أخطاء التي لم أكن قادرا على إصلاح. I استخدام جهاز التحكم عن طريق السماح احدة من نافذتي يكون عضوا في نوع CMap1 (مشتقة من CWnd)، التي تعد واحدة من تلك الفئات المجمع الذي تم إنشاؤه. في CMyWnd::OnCreate() أنا أيضا استدعاء CMap1::Create() وهذا كل شيء، وأنا أنهى: I يمكن إضافة طبقة ويعرض تحكم خريطة العالم
لدي الى حد كبير أي فكرة ما هي الاشياء إشارة العد حول وأنا لم تقم بإضافة أو الإفراج عنهم أية مراجع. على الأقل ليس عن علم ...

والتحكم قديمة جدا: الملف .OCX له عام 2000 في نسخته المعلومات
. هو أيضا غير معتمد رسميا بعد الان ولكن ليس لدي أي substitue.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top