/* */ #pragma once #include "mshtml.h" #include "ihost.h" #include "SxApwComPtr.h" #include "atlwin.h" #include #include "FusionTrace.h" #include "iuiview.h" #include "SxApwWin.h" #include "mshtmdid.h" #include "comdef.h" #include "exdisp.h" extern _ATL_FUNC_INFO s_OnClickSignature; class __declspec(uuid(CLSID_CSxApwHost_declspec_uuid)) CSxApwHost : public ATL::CComObjectRootEx, public ATL::CComCoClass, public ISxApwHost, //public CSxApwHtmlEventSink public IDispatch //public ATL::IDispEventSimpleImpl<1, CSxApwHost, &DIID_HTMLElementEvents2>, //public ATL::IDispEventSimpleImpl<2, CSxApwHost, &DIID_HTMLElementEvents2> { public: //typedef ATL::IDispEventSimpleImpl<1, CSxApwHost, &DIID_HTMLElementEvents2> EventDisp1; //typedef ATL::IDispEventSimpleImpl<2, CSxApwHost, &DIID_HTMLElementEvents2> EventDisp2; CSxApwHost() { } BEGIN_COM_MAP(CSxApwHost) COM_INTERFACE_ENTRY(ISxApwHost) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() DECLARE_NO_REGISTRY(); void __stdcall F1() { printf("%s\n", __FUNCTION__); } void __stdcall F2() { printf("%s\n", __FUNCTION__); } STDMETHOD(Invoke)( DISPID dispId, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr ) { switch (dispId) { case 1: F1(); break; case 2: F2(); break; } return S_OK; } STDMETHOD(GetTypeInfoCount)( UINT* pcinto ) { *pcinto = 0; return S_OK; } STDMETHOD(GetTypeInfo)( UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo ) { *ppTInfo = NULL; return E_NOTIMPL; } STDMETHOD(GetIDsOfNames)( REFIID iid, PWSTR* rgpszNames, UINT cNames, LCID lcid, DISPID* rgDispId ) { // // Simple: find a run of decimal digits in each name, and convert it. // UINT i; for (i = 0 ; i != cNames ; ++i) { rgDispId[i] = _wtoi(rgpszNames[i] + wcscspn(rgpszNames[i], L"0123456789")); } return S_OK; } /* BEGIN_SINK_MAP(CSxApwHost) //SINK_ENTRY(1, DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick1) //SINK_ENTRY(2, DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnClick2) SINK_ENTRY_INFO(1, DIID_HTMLElementEvents2, DISPID_HTMLELEMENTEVENTS2_ONCLICK, F1, &s_OnClickSignature) SINK_ENTRY_INFO(2, DIID_HTMLElementEvents2, DISPID_HTMLELEMENTEVENTS2_ONCLICK, F2, &s_OnClickSignature) END_SINK_MAP() */ STDMETHOD(SetDataSource)( LPCWSTR ); STDMETHOD(CreateView)( LPCWSTR ); STDMETHOD(DestroyView)( LPCWSTR ) { return S_OK; } STDMETHOD(RunQuery)( LPCWSTR ); STDMETHOD(OnNextRow)( int nColumns, const LPCWSTR columns[] ); STDMETHOD(OnRowCountEstimateAvailable)( int ); STDMETHOD(OnQueryDone)( ) { return S_OK; } STDMETHOD(InformSchema)( const SxApwColumnInfo rgColumnInfo[], int nColumnCount ); HRESULT Main(); private: typedef std::vector > Views_t; Views_t m_views; CSxApwComPtr m_dataSource; };