3,055
社区成员
发帖
与我相关
我的任务
分享
void CDHtmlDialog::DisconnectDHtmlElementEvents()
{
const DHtmlEventMapEntry* pEventMap = GetDHtmlEventMap(); //此处报错,内存访问冲突
if (!pEventMap)
return;
int i;
// disconnect from element events
for (i=0; i<m_SinkedElements.GetSize(); i++)
{
CDHtmlElementEventSink *pSink = m_SinkedElements[i];
AtlUnadvise(pSink->m_spunkElem, __uuidof(IDispatch), pSink->m_dwCookie);
delete pSink;
}
m_SinkedElements.RemoveAll();
// disconnect from control events
for (i=0; i<m_ControlSinks.GetSize(); i++)
{
DisconnectFromConnectionPoint(m_ControlSinks[i]->m_spunkObj,
m_ControlSinks[i]->m_iid, m_ControlSinks[i]->m_dwCookie);
delete m_ControlSinks[i];
}
m_ControlSinks.RemoveAll();
return;
}
void CDHtmlDialog::DisconnectDHtmlEvents()
{
CComPtr<IHTMLDocument2> sphtmlDoc;
GetDHtmlDocument(&sphtmlDoc);
if (sphtmlDoc == NULL)
return;
//先调用DisconnectFromConnectionPoint
DisconnectFromConnectionPoint(sphtmlDoc, __uuidof(HTMLDocumentEvents), m_dwDHtmlEventSinkCookie);
//再调用DisconnectDHtmlElementEvents
DisconnectDHtmlElementEvents();
}
void CDHtmlEventSink::DisconnectFromConnectionPoint(IUnknown *punkObj, REFIID riid, DWORD& dwCookie)
{
AtlUnadvise(punkObj, riid, dwCookie);
}
//再跟进去
ATLINLINE ATLAPI AtlUnadvise(
_Inout_ IUnknown* pUnkCP,
_In_ const IID& iid,
_In_ DWORD dw)
{
if(pUnkCP == NULL)
return E_INVALIDARG;
CComPtr<IConnectionPointContainer> pCPC;
CComPtr<IConnectionPoint> pCP;
HRESULT hRes = pUnkCP->QueryInterface(__uuidof(IConnectionPointContainer), (void**)&pCPC);
if (SUCCEEDED(hRes))
hRes = pCPC->FindConnectionPoint(iid, &pCP);
if (SUCCEEDED(hRes))
hRes = pCP->Unadvise(dw);//到此为止了,vs进不去了
return hRes;
}