From: Ale on 26 Jul 2006 21:52 Hi all, I'm having problem in handling the ONCLICK event from HTMLElementEvents I've connect the interface to my Sink object- code follow - but when accessing to ElementObject I got an access violation... To catch the event I've derived a class from CCmdTarget: class CEventSink : public CCmdTarget { public: void OnClick( IHTMLEventObj *pEvtObj ); DECLARE_DISPATCH_MAP() }; in cpp: // For HTML Events BEGIN_DISPATCH_MAP(CEventSink, CCmdTarget) DISP_FUNCTION_ID(CEventSink, "OnClick", DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick, VT_EMPTY, VTS_VARIANT ) END_DISPATCH_MAP() // END HTML Events void CEventSink::OnClick(IHTMLEventObj *pEvtObj) { AfxMessageBox( _T("ONCLICK sink") ); } each time I access to pEvtObj I got an access violation... To connect tht interface I've used DIID_HTMLButtonElementEvents because DIID_HTMLElementEvents is not supported by the HTMLElement... I do not know why!! The element is a button inside a html page... here is the code I've used to connect the event interface: HRESULT hr; LPDISPATCH pBrowserDispatch = NULL; IUnknown* pUnkBrowser = NULL; IHTMLDocument2* pDocument2 = NULL; IDispatch* pDocumentDispatch = NULL; pUnkBrowser = m_Browser.GetControlUnknown(); if( !pUnkBrowser ) return; pUnkBrowser->QueryInterface( IID_IDispatch, (void**)&pBrowserDispatch ); if( !pBrowserDispatch ) return; if( pDisp == pBrowserDispatch ) { pDocumentDispatch = m_Browser.get_Document(); if( pDocumentDispatch ) { pDocumentDispatch->QueryInterface( IID_IHTMLDocument2, (void**)&pDocument2 ); BOOL a = AfxConnectionAdvise( pDocument2, DIID_HTMLDocumentEvents2, m_pEventSink->GetIDispatch(FALSE), FALSE, &m_dwEventSink ); IHTMLElementCollection* pElemCollection = NULL; hr = pDocument2->get_all( &pElemCollection ); if( SUCCEEDED(hr) ) { // Obtained element collection. IDispatch* pElementDispatch = NULL; IHTMLElement* pElement = NULL; pElemCollection->item( COleVariant( _T("ale")), COleVariant((long)0), &pElementDispatch ); if( pElementDispatch ) { hr = pElementDispatch->QueryInterface(IID_IHTMLElement, (void**)&pElement); if( pElement ) { //ConnectEvents( pElement ); AfxConnectionAdvise( pElement, DIID_HTMLButtonElementEvents, m_pEventSink->GetIDispatch(FALSE), FALSE, &m_dwEventSink ); pElement->Release(); } pElementDispatch->Release(); } pElemCollection->Release(); } pDocument2->Release(); } } pBrowserDispatch->Release(); Thanks Ale
From: Jeff Partch on 27 Jul 2006 02:15 This is just off the top of my head, but it might be because there is no IHTMLEventObj. The documentation for the HTMLButtonElementEvents::onclick event prototypes it as... VARIANT_BOOL onclick(VOID) ....whereas for the HTMLButtonElementEvents2::onclick event it is... VARIANT_BOOL onclick(IHTMLEventObj *pEvtObj) -- Jeff Partch [VC++ MVP] "Ale" <Ale(a)discussions.microsoft.com> wrote in message news:C3657EF5-0B66-419A-BDD1-923C741C5FE1(a)microsoft.com... > Hi all, > I'm having problem in handling the ONCLICK event from HTMLElementEvents > > I've connect the interface to my Sink object- code follow - but when > accessing to ElementObject I got an access violation... > > To catch the event I've derived a class from CCmdTarget: > > class CEventSink : public CCmdTarget > { > public: > void OnClick( IHTMLEventObj *pEvtObj ); > > DECLARE_DISPATCH_MAP() > }; > > in cpp: > > // For HTML Events > BEGIN_DISPATCH_MAP(CEventSink, CCmdTarget) > DISP_FUNCTION_ID(CEventSink, "OnClick", DISPID_HTMLELEMENTEVENTS2_ONCLICK, > OnClick, VT_EMPTY, VTS_VARIANT ) > END_DISPATCH_MAP() > // END HTML Events > > void CEventSink::OnClick(IHTMLEventObj *pEvtObj) > { > AfxMessageBox( _T("ONCLICK sink") ); > } > > each time I access to pEvtObj I got an access violation... > > To connect tht interface I've used DIID_HTMLButtonElementEvents because > DIID_HTMLElementEvents is not supported by the HTMLElement... I do not > know > why!! > > The element is a button inside a html page... > > here is the code I've used to connect the event interface: > > HRESULT hr; > > LPDISPATCH pBrowserDispatch = NULL; > IUnknown* pUnkBrowser = NULL; > IHTMLDocument2* pDocument2 = NULL; > IDispatch* pDocumentDispatch = NULL; > > pUnkBrowser = m_Browser.GetControlUnknown(); > if( !pUnkBrowser ) > return; > > pUnkBrowser->QueryInterface( IID_IDispatch, (void**)&pBrowserDispatch ); > if( !pBrowserDispatch ) > return; > > if( pDisp == pBrowserDispatch ) > { > pDocumentDispatch = m_Browser.get_Document(); > > if( pDocumentDispatch ) > { > pDocumentDispatch->QueryInterface( IID_IHTMLDocument2, > (void**)&pDocument2 ); > > BOOL a = AfxConnectionAdvise( pDocument2, DIID_HTMLDocumentEvents2, > m_pEventSink->GetIDispatch(FALSE), FALSE, &m_dwEventSink ); > > IHTMLElementCollection* pElemCollection = NULL; > > hr = pDocument2->get_all( &pElemCollection ); > > if( SUCCEEDED(hr) ) > { > // Obtained element collection. > IDispatch* pElementDispatch = NULL; > IHTMLElement* pElement = NULL; > > pElemCollection->item( COleVariant( _T("ale")), COleVariant((long)0), > &pElementDispatch ); > > if( pElementDispatch ) > { > hr = pElementDispatch->QueryInterface(IID_IHTMLElement, > (void**)&pElement); > > if( pElement ) > { > //ConnectEvents( pElement ); > AfxConnectionAdvise( pElement, DIID_HTMLButtonElementEvents, > m_pEventSink->GetIDispatch(FALSE), FALSE, &m_dwEventSink ); > pElement->Release(); > } > > pElementDispatch->Release(); > > } > > pElemCollection->Release(); > } > > pDocument2->Release(); > } > } > > pBrowserDispatch->Release(); > > Thanks > Ale
From: Ale on 27 Jul 2006 08:04 maybe... The problem was on VTS_VARIANT instead of VTS_UNKNOWN However, such interface has not the member get_SrcElement, infact it returns such error... I to get onclick from a button? thanks ale "Jeff Partch" wrote: > This is just off the top of my head, but it might be because there is no > IHTMLEventObj. > > The documentation for the HTMLButtonElementEvents::onclick event prototypes > it as... > > VARIANT_BOOL onclick(VOID) > > ....whereas for the HTMLButtonElementEvents2::onclick event it is... > > VARIANT_BOOL onclick(IHTMLEventObj *pEvtObj) > > -- > Jeff Partch [VC++ MVP] > > > "Ale" <Ale(a)discussions.microsoft.com> wrote in message > news:C3657EF5-0B66-419A-BDD1-923C741C5FE1(a)microsoft.com... > > Hi all, > > I'm having problem in handling the ONCLICK event from HTMLElementEvents > > > > I've connect the interface to my Sink object- code follow - but when > > accessing to ElementObject I got an access violation... > > > > To catch the event I've derived a class from CCmdTarget: > > > > class CEventSink : public CCmdTarget > > { > > public: > > void OnClick( IHTMLEventObj *pEvtObj ); > > > > DECLARE_DISPATCH_MAP() > > }; > > > > in cpp: > > > > // For HTML Events > > BEGIN_DISPATCH_MAP(CEventSink, CCmdTarget) > > DISP_FUNCTION_ID(CEventSink, "OnClick", DISPID_HTMLELEMENTEVENTS2_ONCLICK, > > OnClick, VT_EMPTY, VTS_VARIANT ) > > END_DISPATCH_MAP() > > // END HTML Events > > > > void CEventSink::OnClick(IHTMLEventObj *pEvtObj) > > { > > AfxMessageBox( _T("ONCLICK sink") ); > > } > > > > each time I access to pEvtObj I got an access violation... > > > > To connect tht interface I've used DIID_HTMLButtonElementEvents because > > DIID_HTMLElementEvents is not supported by the HTMLElement... I do not > > know > > why!! > > > > The element is a button inside a html page... > > > > here is the code I've used to connect the event interface: > > > > HRESULT hr; > > > > LPDISPATCH pBrowserDispatch = NULL; > > IUnknown* pUnkBrowser = NULL; > > IHTMLDocument2* pDocument2 = NULL; > > IDispatch* pDocumentDispatch = NULL; > > > > pUnkBrowser = m_Browser.GetControlUnknown(); > > if( !pUnkBrowser ) > > return; > > > > pUnkBrowser->QueryInterface( IID_IDispatch, (void**)&pBrowserDispatch ); > > if( !pBrowserDispatch ) > > return; > > > > if( pDisp == pBrowserDispatch ) > > { > > pDocumentDispatch = m_Browser.get_Document(); > > > > if( pDocumentDispatch ) > > { > > pDocumentDispatch->QueryInterface( IID_IHTMLDocument2, > > (void**)&pDocument2 ); > > > > BOOL a = AfxConnectionAdvise( pDocument2, DIID_HTMLDocumentEvents2, > > m_pEventSink->GetIDispatch(FALSE), FALSE, &m_dwEventSink ); > > > > IHTMLElementCollection* pElemCollection = NULL; > > > > hr = pDocument2->get_all( &pElemCollection ); > > > > if( SUCCEEDED(hr) ) > > { > > // Obtained element collection. > > IDispatch* pElementDispatch = NULL; > > IHTMLElement* pElement = NULL; > > > > pElemCollection->item( COleVariant( _T("ale")), COleVariant((long)0), > > &pElementDispatch ); > > > > if( pElementDispatch ) > > { > > hr = pElementDispatch->QueryInterface(IID_IHTMLElement, > > (void**)&pElement); > > > > if( pElement ) > > { > > //ConnectEvents( pElement ); > > AfxConnectionAdvise( pElement, DIID_HTMLButtonElementEvents, > > m_pEventSink->GetIDispatch(FALSE), FALSE, &m_dwEventSink ); > > pElement->Release(); > > } > > > > pElementDispatch->Release(); > > > > } > > > > pElemCollection->Release(); > > } > > > > pDocument2->Release(); > > } > > } > > > > pBrowserDispatch->Release(); > > > > Thanks > > Ale > > >
|
Pages: 1 Prev: creating a JPEG file Next: Open, process & print documents without user interface |