MFC拖入C#Drop

时间:2013-11-22 08:58:40

标签: c# mfc

我有一个ProjectA(MFC Dlg)包含usercontrol(Chart c#)

当我将项目(CTreectrl)从MFC Dlg拖动到C#图表时。

例如: http://i.stack.imgur.com/wkatk.png

将调用C#m_chartGantt_DragOver。崩溃 “Debug Assertion failed!... cmdtarg.cpp 43”

private void m_chartGantt_DragOver(object sender, DragEventArgs e)
private void m_chartGantt_DragDrop(object sender, DragEventArgs e)

我不知道如何修复它?或者它实际上不起作用? 任何评论都将不胜感激。

这是MFC代码。

void CDropButton::OnLButtonDown( UINT nFlags, CPoint point ){
  COleDataSource *pDataSource = new COleDataSource();
  if (DoCopyData(pDataSource))
  {
      pDataSource->DoDragDrop(DROPEFFECT_COPY);
  }
  if (pDataSource)
  {
      delete pDataSource;   **// error here!!**
  }
}

BOOL CDropTreeCtrl::DoCopyData(COleDataSource *pDataSource)
{ 
    char  szText[] = _T("Here is some sample text that was copied using a COleDataSource object!");

    HGLOBAL hMem = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE, ::lstrlen (szText) +1);
    if (hMem != NULL)
    {
        LPSTR pData = (LPSTR) ::GlobalLock(hMem);
        ::lstrcpy (pData, szText);
        pDataSource->CacheGlobalData(CF_UNICODETEXT, hMem);
        return TRUE;
    }

    return FALSE;
}

修改

如果有帮助,这段代码涵盖了cmdtarg.cpp的第43行:

CCmdTarget::~CCmdTarget()
{
#ifndef _AFX_NO_OLE_SUPPORT
    if (m_xDispatch.m_vtbl != 0)
        ((COleDispatchImpl*)&m_xDispatch)->Disconnect();
    ASSERT(m_dwRef <= 1);
#endif
    m_pModuleState = NULL;
}

1 个答案:

答案 0 :(得分:1)

调用DoDragDrop后,您不必删除pDataSource。

它是一个COM对象,其生命周期仅由COM控制。

ASSERT告诉你有人试图在使用它时删除它。验证它并查看callstack。这是你的删除!