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;
}
Merci beaucoup! –