Re: AV в деструкторе COleDataSource
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 05.12.18 09:09
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

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


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


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


Вообще странно, что это помогло. Потому что деструктор ds и так вызывает Empty

COleDataSource::~COleDataSource()
{
    // clear clipboard source if this object was on the clipboard
    _AFX_OLE_STATE* pOleState = _afxOleState;
    if (this == pOleState->m_pClipboardSource)
        pOleState->m_pClipboardSource = NULL;

    // free the clipboard data cache
    Empty();
}


И в этом Empty ничего военного нет:

void COleDataSource::Empty()
{
    if (m_pDataCache != NULL)
    {
        ASSERT(m_nMaxSize != 0);
        ASSERT(m_nSize != 0);

        // release all of the STGMEDIUMs and FORMATETCs
        for (UINT nIndex = 0; nIndex < m_nSize; nIndex++)
        {
            CoTaskMemFree(m_pDataCache[nIndex].m_formatEtc.ptd);
            ::ReleaseStgMedium(&m_pDataCache[nIndex].m_stgMedium);
        }

        // delete the cache
        delete[] m_pDataCache;
        m_pDataCache = NULL;
        m_nMaxSize = 0;
        m_nSize = 0;
    }
    ASSERT(m_pDataCache == NULL);
    ASSERT(m_nMaxSize == 0);
    ASSERT(m_nSize == 0);
}


Наверное AV таки потом все равно вылезет
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.