2013-11-22 102 views
0

我有一個項目A(MFC DLG)包括該用戶控件(圖C#)MFC拖動到C#掉落

當我拖動從MFC DLG的項目(CTreeCtrl的)與C#圖表。

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

和C#m_chartGantt_DragOver將被調用。但崩潰 「調試斷言失敗!...... 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; 
} 
+0

ASSERT的代碼是什麼,請告訴我們失敗的條件。 – xMRi

+0

對不起。一個好人,我再次編輯它。可以嗎? – user2894287

回答

1

您不必刪除pDataSource你叫後的DoDragDrop。

它是一個COM對象,它的生存期只受COM控制。

ASSERT告訴你有人試圖在使用中刪除對象。驗證它並查看調用堆棧。這是你的刪除!

+0

非常感謝!我會盡力理解這一點!再次感謝 !!所以我必須刪除C#圖表中的pDataSource?或者COM自己實際上自動刪除它? – user2894287

+0

COM在最後一個引用結束後會自動刪除它。 – xMRi

+0

但MFC將其顯示爲內存泄漏。應該有一些其他的出路。 –