Посоветуйте мойку HTMLElementEvents2 (сайт MSDN) - PullRequest
1 голос
/ 14 июля 2009

с сайта 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 ?????????

Конец редактирования]

1 Ответ

0 голосов
/ 16 июля 2009

Образец ATLEventHandling

Edit:

void CMyClass::ConnectEvents(IHTMLElement* pElem)
{
    typedef IDispEventImpl<2, CMyClass, DIID_HTMLElementEvents2, LIBID_MSHTML, 4, 0> IMyClassHTMLElementEvents2Sink;
    IMyClassHTMLElementEvents2Sink::DispEventAdvise(pElem);
}

Поскольку у вас есть несколько функций DispEventAdvise в базовых IDispEventImpl классах.

Также кажется, что самая ранняя версия MSHTML, определяющая HTMLElementEvents2, - 5.0.

...