2010-10-07 93 views
0

我正在開發用於VC6和VC9的VC加載項。以下代碼來自我的作品。在CViaDevStudio::Evaluate之後,我打電話給pDebugger->Release(),一切正常。但在CViaVisualStudio::ReadFromMemory中,在我撥打pDebugger->Release()pProc->Release()後,VC9會提示錯誤提示錯誤號碼未指定。我不知道爲什麼。我認爲在使用COM對象後調用Release()是合理的。爲什麼我不能調用發佈COM對象的接口

/* VC6 */ 
class CViaDevStudio { 
... 
IApplication* m_pApplication; 
}; 

BOOL CViaDevStudio::Evaluate(char* szExp, TCHAR* value, int size) 
{ 
    BOOL re = FALSE; 
    IDebugger* pDebugger = NULL; 
    m_pApplication->get_Debugger((IDispatch**)&pDebugger); 

    if (pDebugger) { 
     ... 
    } 

exit: 
     // The following code must be called, otherwise VC6 will complaint invalid access 
     // when it's started again 
    if (pDebugger) 
     pDebugger->Release(); 

    return re; 
}  

/* VC9 */ 
class  CViaVisualStudio { 
    ... 
    CComPtr<EnvDTE::_DTE> m_pApplication; 
}; 

BOOL CViaVisualStudio::ReadFromMemory(PBYTE pDst, PBYTE pSrc, long size) 
{ 
    BOOL re = FALSE; 
    EnvDTE::DebuggerPtr pDebugger; 
    EnvDTE::ProcessPtr pProc; 

    if (S_OK == m_pApplication->get_Debugger(&pDebugger)) { 
     if (S_OK == pDebugger->get_CurrentProcess(&pProc)) { 
      ... 
      } 
     } 
    } 

exit: 
    // I don't know why the following enclosed with macros should not be called. 
#if 0 
    if (pDebugger) 
     pDebugger->Release(); 
    if (pProc) 
     pProc->Release(); 
#endif 
    return re; 
} 

回答

2
EnvDTE::DebuggerPtr pDebugger; 

注意指針的聲明是如何從你做到了在評估方式不同。這是一個IDebugger *。 DebuggerPtr類是由#import指令生成的包裝類。它是一個智能指針類,它知道如何自動調用Release()。即使代碼拋出異常,它也不會泄漏指針。強烈推薦。你會發現它在MSDN庫中記錄爲_com_ptr_t類。

+0

非常感謝! – 2010-10-08 02:17:59

相關問題