FIX: Enumerating Connection Points Causes GP Fault

ID: Q131102


The information in this article applies to:
  • Microsoft OLE Control Developer's Kit (CDK) for Windows and Windows NT, versions 1.0 and 1.1


SYMPTOMS

Attempting to enumerate connection points with the IEnumConnectionPoints interface results in a general protection (GP) fault. Specifically, attempting to call the IEnumConnectionPoints::Next() method cause a GP Fault.


CAUSE

The problem occurs in the CEnumConnPoints::OnNext() function located in the CDK source file CTLCONN.CPP.


   BOOL CEnumConnPoints::OnNext(void FAR* pv)
   {
      if (!CEnumArray::OnNext(pv))
         return FALSE;

      // outgoing connection point needs to be AddRef'ed
      //  (the caller has responsibility to release it)

      ((LPCONNECTIONPOINT)pv)->AddRef();
      return TRUE;
   } 
AddRef() is called through an improperly dereferenced pointer. The line of code should be this:

   (*(LPCONNECTIONPOINT*)pv)->AddRef(); 


RESOLUTION

Currently, there is no workaround for this problem. Avoid enumerating connection points. You can also retrieve connection points with the IConnectionPointContainer::FindConnectionPointFromIID() function.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem has been fixed in Visual C++ version 5.0.


MORE INFORMATION

Visual C++ Version 2.x Sample Code to Demonstrate Problem


   void CControlContainerView::OnEnumCtrlConnPoints()
   {
      if (!m_pSelection) // pointer to a COleClientItem derived object
                         // that supports additional OLE Control interfaces

      {
         AfxMessageBox(_T("No Control selected!"));
         return;
      }

      LPCONNECTIONPOINTCONTAINER lpCPC;
      LPENUMCONNECTIONPOINTS lpEnumCPTS;
      LPCONNECTIONPOINT lpCPT;

      if (SUCCEEDED(m_lpSelection->m_lpObject->QueryInterface(
         IID_IConnectionPointContainer,(LPVOID FAR*)&lpCPC)))
      {
         if (SUCCEEDED(lpCPC->EnumConnectionPoints(&lpEnumCPTS)))
         {
            HRESULT hr = lpEnumCPTS->Next(1,&lpCPT,NULL); //GPF occurs here

            if (NOERROR == hr)
            {
               AfxMessageBox(_T("Connection Point retrieved!"));
               lpCPT->Release();
            }
            lpEnumCPTS->Release();
         }
         else
            AfxMessageBox(_T("EnumConnectionPoints failed!"));

         lpCPC->Release
      }
      else
         AfxMessageBox(_T("QI for IConnectionPointContainer failed!"));
   } 

Additional query words: GPF

Keywords : kbole kbprg kbCtrl kbMFC kbVC kbVC500fix
Version :
Platform :
Issue type : kbbug


Last Reviewed: January 20, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.