FIX: Enumerating Connection Points Causes GP FaultLast reviewed: September 18, 1997Article ID: Q131102 |
The information in this article applies to:
SYMPTOMSAttempting 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.
CAUSEThe 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(); RESOLUTIONCurrently, there is no workaround for this problem. Avoid enumerating connection points. You can also retrieve connection points with the IConnectionPointContainer::FindConnectionPointFromIID() function.
STATUSMicrosoft 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
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |