AV в деструкторе COleDataSource
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.12.18 08:59
Оценка:
Подскажите, плиз, по поводу COleDataSource.

Пытаюсь починить древний код, юзающий MFC.

https://github.com/dmitry-lipetsk/cvsgui/blob/05977436ac2a64ba4ac4dd3e85a62ea566a9d3f5/WinCvs/BrowseFileView.cpp#L2851-L2853

COleDataSource ds;
ds.CacheGlobalData( CF_HDROP, hMem );
ds.DoDragDrop( DROPEFFECT_COPY );


Вылазит ассерт в глубинах деструктора ~COleDataSource.

CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
    if (m_xDispatch.m_vtbl != 0)
        ((COleDispatchImpl*)&m_xDispatch)->Disconnect();
    ASSERT(m_dwRef <= 1); // <------------- ВОТ ЗДЕСЬ. m_dwRef равен 4.
#endif
    m_pModuleState = NULL;
}


Я добавил вызов ds.Empty() и AV вроде перестала вылазить.

COleDataSource ds;
ds.CacheGlobalData( CF_HDROP, hMem );
ds.DoDragDrop( DROPEFFECT_COPY );
ds.Empty(); // <----- Помогло, вроде.


Это нормальный костыль?

Дополнительная информация. На Win7 у меня AV не вылазил. На Win10 вылазит.

Программулина компилируется в VS2010.

Заранее благодарю всех, кто даст толковые советы и камменты

UPD. Костыль не работает. Есть еще вариант — переместить ds на уровень класса, тогда AV будет вылазить только один раз — при закрытии
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Отредактировано 05.12.2018 9:43 Коваленко Дмитрий . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.