Question : VC7: Newly introduced bugs in MFC\Src\viewhtml.cpp

Have a look at the following MFC source code in Visual Studio .NET 2003.

void CHtmlView::OnFilePrint()
{
      // get the HTMLDocument

      if (m_pBrowserApp != NULL)
      {
            CComPtr spDisp = GetHtmlDocument();

            if (spDisp != NULL)
            {
                  // the control will handle all printing UI

                  CComQIPtrt> spTarget = spDisp;
                  if (spTarget != NULL)
                        spTarget->Exec(NULL, OLECMDID_PRINT, 0, NULL, NULL);
            }
      }
}

LPDISPATCH CHtmlView::GetHtmlDocument() const
{
      ASSERT(m_pBrowserApp != NULL);

      LPDISPATCH result;
      HRESULT hr = m_pBrowserApp->get_Document(&result);
      if(FAILED(hr))
      {
            ASSERT(FALSE);
            return NULL;
      }
      
      return result;
}

CHtmlView::GetHtmlDocument() calls m_pBrowserApp->get_Document() to get the IDispatch. So the RefCount is increased by one. Then in CHtmlView::OnFilePrint(), the returned interface pointer is passed to CComPtr. The constructor of CComPtr will call AddRef() on the interface pointer. So now the RefCount is increased by two. In the end, the destructor of CComPtr will call Release() once. But the original RefCount returned by CHtmlView::GetHtmlDocument() is never released. All the functions using GetHtmlDocument() have this bug, including

CHtmlView::OnFilePrint
CHtmlView::ExecFormsCommand
CHtmlView::QueryFormsCommand
CHtmlView::GetSource

This is a new bug in VC7. The bug was not in VC6 in that it didn't use CComPtr.

Answer : VC7: Newly introduced bugs in MFC\Src\viewhtml.cpp

PAQed, with points refunded (50)

modulo
Community Support Moderator
Random Solutions  
 
programming4us programming4us