Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Я добавил вызов 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 таки потом все равно вылезет
-- Пользователи не приняли программу. Всех пришлось уничтожить. --