| 
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