с сайта msdn
void CMyClass::ConnectEvents(IHTMLElement* pElem)
{
HRESULT hr;
IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
DWORD dwCookie;
// Check that this is a connectable object.
hr = pElem->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
if (SUCCEEDED(hr))
{
// Find the connection point.
hr = pCPC->FindConnectionPoint(DIID_HTMLElementEvents2, &pCP);
if (SUCCEEDED(hr))
{
// Advise the connection point.
// pUnk is the IUnknown interface pointer for your event sink
hr = pCP->Advise(pUnk, &dwCookie);
if (SUCCEEDED(hr))
{
// Successfully advised
}
pCP->Release();
}
pCPC->Release();
}
}
Как мне получить указатель pUnk? Я определил CComObject * pUnk как глобальную переменную и инициализирую ее как CComObject :: CreateInstance (& pUnk); Затем я использую определенное таким образом pUnk в приведенном выше коде, который дает следующие ошибки:
Ошибка 1, ошибка C2065: «m_dwRef»: необъявленный идентификатор c: \ program files \ microsoft visual studio 9.0 \ vc \ atlmfc \ include \ atlcom.h 2575
Ошибка 2, ошибка C3861: «FinalRelease»: идентификатор не найден c: \ program files \ microsoft visual studio 9.0 \ vc \ atlmfc \ include \ atlcom.h 2576
Что было бы правильным способом получить PUNK?
Пример кода будет очень полезен.
Спасибо!
[Edit: я пытаюсь использовать этот пример кода в моем приложении расширения IE, которое использует ATL для обработки HTMLElementEvents2. Мой класс наследуется от IDispEventImpl для обработки событий веб-браузера, и я пытаюсь извлечь из другого экземпляра IDispEventImpl для обработки HTMLElementEvents2
class ATL_NO_VTABLE CMyClass:
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSecurMailBHO, &CLSID_MyClass>,
public IObjectWithSiteImpl<CMyClass>,
public IDispatchImpl<ISecurMailBHO, &IID_IMyClass, &LIBID_MyClassLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CMyClass, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>, //Safe alternative to Invoke
public IDispEventImpl<2, CMyClass, &DIID_HTMLElementEvents2, &LIBID_MSHTML, 4, 0>
{
.
.
.
BEGIN_SINK_MAP(CMyClass)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)//Do stuff OnDocumentComplete
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
SINK_ENTRY_EX(2, DIID_HTMLElementEvents2, DISPID_HTMLELEMENTEVENTS2_ONSCROLL, OnScroll)//Handle OnScroll Event
END_SINK_MAP()
.
.
}
В моем OnDocumentComplete я вызываю IWebBrowser2 :: get_Document, а затем IHTMLDocument2 :: get_body, чтобы получить тело объекта IHTMLElement. Это то, что отправляется в функцию ConnectEvents выше. Но пока не повезло. Я не знаю, что такое указатель pUnk, и, кроме того, кажется, что вызов FindConnectionPoint не выполняется, т. Е. В контейнере точек нет точки подключения HTMLElementEvents2. Любые идеи относительно того, как я должен идти об обработке htmlelementevents ?????????
Конец редактирования]