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. |