2010-10-07 44 views
0

Je développe un VC Add-In pour VC6 et VC9. Les codes suivants proviennent de mes travaux. Dans CViaDevStudio::Evaluate, après que j'appelle pDebugger->Release() et tout est OK. Mais dans CViaVisualStudio::ReadFromMemory, après que j'appelle pDebugger->Release() ou pProc->Release(), VC9 demandera une plainte d'erreur un nombre d'erreur non spécifié. Je ne sais pas pourquoi. Je pense qu'il est raisonnable d'appeler Release() après avoir utilisé un objet COM.Pourquoi je ne peux pas appeler l'interface de libération d'un objet 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; 
} 

Répondre

2
EnvDTE::DebuggerPtr pDebugger; 

Notez comment la déclaration du pointeur est différent de la façon dont vous l'avez fait à évaluer. C'est un IDebugger * là. La classe DebuggerPtr est une classe wrapper générée par la directive # import. C'est une classe de pointeurs intelligente, elle sait comment appeler Release() automatiquement. Même si le code émet des exceptions, il ne fuira pas le pointeur. Hautement recommandé. Vous le trouverez documenté dans la bibliothèque MSDN en tant que classe _com_ptr_t.

+0

Merci beaucoup! –