/////////////////////////////////////////////////////////////////////////////// // Name: wx/msw/ole/activex.h // Purpose: wxActiveXContainer class // Author: Ryan Norton // Modified by: // Created: 8/18/05 // RCS-ID: $Id$ // Copyright: (c) Ryan Norton // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ============================================================================ // Definitions // ============================================================================ #ifndef _WX_MSW_OLE_ACTIVEXCONTAINER_H_ #define _WX_MSW_OLE_ACTIVEXCONTAINER_H_ #if wxUSE_ACTIVEX //--------------------------------------------------------------------------- // wx includes //--------------------------------------------------------------------------- #include "wx/msw/ole/oleutils.h" // wxBasicString &c #include "wx/msw/ole/uuid.h" #include "wx/window.h" #include "wx/variant.h" class FrameSite; //--------------------------------------------------------------------------- // MSW COM includes //--------------------------------------------------------------------------- #include #include #if !defined(__WXWINCE__) || defined(__WINCE_STANDARDSDK__) #include #endif #include #ifndef STDMETHOD #define STDMETHOD(funcname) virtual HRESULT wxSTDCALL funcname #endif // // These defines are from another ole header - but its not in the // latest sdk. Also the ifndef DISPID_READYSTATE is here because at // least on my machine with the latest sdk olectl.h defines these 3 // #ifndef DISPID_READYSTATE #define DISPID_READYSTATE (-525) #define DISPID_READYSTATECHANGE (-609) #define DISPID_AMBIENT_TRANSFERPRIORITY (-728) #endif #define DISPID_AMBIENT_OFFLINEIFNOTCONNECTED (-5501) #define DISPID_AMBIENT_SILENT (-5502) #ifndef DISPID_AMBIENT_CODEPAGE #define DISPID_AMBIENT_CODEPAGE (-725) #define DISPID_AMBIENT_CHARSET (-727) #endif //--------------------------------------------------------------------------- // // wxActiveXContainer // //--------------------------------------------------------------------------- #define WX_DECLARE_AUTOOLE(wxAutoOleInterface, I) \ class wxAutoOleInterface \ { \ protected: \ I *m_interface; \ \ public: \ explicit wxAutoOleInterface(I *pInterface = NULL) : m_interface(pInterface) {} \ wxAutoOleInterface(REFIID riid, IUnknown *pUnk) : m_interface(NULL) \ { QueryInterface(riid, pUnk); } \ wxAutoOleInterface(REFIID riid, IDispatch *pDispatch) : m_interface(NULL) \ { QueryInterface(riid, pDispatch); } \ wxAutoOleInterface(REFCLSID clsid, REFIID riid) : m_interface(NULL)\ { CreateInstance(clsid, riid); }\ wxAutoOleInterface(const wxAutoOleInterface& ti) : m_interface(NULL)\ { operator = (ti); }\ \ wxAutoOleInterface& operator = (const wxAutoOleInterface& ti)\ {\ if (ti.m_interface)\ ti.m_interface->AddRef();\ Free();\ m_interface = ti.m_interface;\ return *this;\ }\ \ wxAutoOleInterface& operator = (I *&ti)\ {\ Free();\ m_interface = ti;\ return *this;\ }\ \ ~wxAutoOleInterface() { Free(); }\ \ inline void Free()\ {\ if (m_interface)\ m_interface->Release();\ m_interface = NULL;\ }\ \ HRESULT QueryInterface(REFIID riid, IUnknown *pUnk)\ {\ Free();\ wxASSERT(pUnk != NULL);\ return pUnk->QueryInterface(riid, (void **) &m_interface);\ }\ \ HRESULT CreateInstance(REFCLSID clsid, REFIID riid)\ {\ Free();\ return CoCreateInstance(clsid, NULL, CLSCTX_ALL, riid, (void **) &m_interface);\ }\ \ inline operator I *() const {return m_interface;}\ inline I* operator ->() {return m_interface;}\ inline I** GetRef() {return &m_interface;}\ inline bool Ok() const { return IsOk(); }\ inline bool IsOk() const {return m_interface != NULL;}\ }; WX_DECLARE_AUTOOLE(wxAutoIDispatch, IDispatch) WX_DECLARE_AUTOOLE(wxAutoIOleClientSite, IOleClientSite) WX_DECLARE_AUTOOLE(wxAutoIUnknown, IUnknown) WX_DECLARE_AUTOOLE(wxAutoIOleObject, IOleObject) WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceObject, IOleInPlaceObject) WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceActiveObject, IOleInPlaceActiveObject) WX_DECLARE_AUTOOLE(wxAutoIOleDocumentView, IOleDocumentView) WX_DECLARE_AUTOOLE(wxAutoIViewObject, IViewObject) class WXDLLIMPEXP_CORE wxActiveXContainer : public wxWindow { public: wxActiveXContainer(wxWindow * parent, REFIID iid, IUnknown* pUnk); virtual ~wxActiveXContainer(); void OnSize(wxSizeEvent&); void OnPaint(wxPaintEvent&); void OnSetFocus(wxFocusEvent&); void OnKillFocus(wxFocusEvent&); protected: friend class FrameSite; friend class wxActiveXEvents; FrameSite *m_frameSite; wxAutoIDispatch m_Dispatch; wxAutoIOleClientSite m_clientSite; wxAutoIUnknown m_ActiveX; wxAutoIOleObject m_oleObject; wxAutoIOleInPlaceObject m_oleInPlaceObject; wxAutoIOleInPlaceActiveObject m_oleInPlaceActiveObject; wxAutoIOleDocumentView m_docView; wxAutoIViewObject m_viewObject; HWND m_oleObjectHWND; bool m_bAmbientUserMode; DWORD m_docAdviseCookie; wxWindow* m_realparent; void CreateActiveX(REFIID, IUnknown*); }; ///\brief Store native event parameters. ///\detail Store OLE 'Invoke' parameters for event handlers that need to access them. /// These are the exact values for the event as they are passed to the wxActiveXContainer. struct wxActiveXEventNativeMSW { DISPID dispIdMember; REFIID riid; LCID lcid; WORD wFlags; DISPPARAMS *pDispParams; VARIANT *pVarResult; EXCEPINFO *pExcepInfo; unsigned int *puArgErr; wxActiveXEventNativeMSW (DISPID a_dispIdMember, REFIID a_riid, LCID a_lcid, WORD a_wFlags, DISPPARAMS *a_pDispParams, VARIANT *a_pVarResult, EXCEPINFO *a_pExcepInfo, unsigned int *a_puArgErr) :dispIdMember(a_dispIdMember), riid(a_riid), lcid(a_lcid), wFlags(a_wFlags), pDispParams(a_pDispParams), pVarResult(a_pVarResult), pExcepInfo(a_pExcepInfo), puArgErr(a_puArgErr) { } }; // Events class WXDLLIMPEXP_CORE wxActiveXEvent : public wxCommandEvent { private: friend class wxActiveXEvents; wxVariant m_params; DISPID m_dispid; public: virtual wxEvent *Clone() const { return new wxActiveXEvent(*this); } size_t ParamCount() const; wxString ParamType(size_t idx) const { wxASSERT(idx < ParamCount()); return m_params[idx].GetType(); } wxString ParamName(size_t idx) const { wxASSERT(idx < ParamCount()); return m_params[idx].GetName(); } wxVariant& operator[] (size_t idx); DISPID GetDispatchId() const { return m_dispid; } wxActiveXEventNativeMSW *GetNativeParameters() const { return (wxActiveXEventNativeMSW*)GetClientData(); } }; // #define wxACTIVEX_ID 14001 wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_CORE, wxEVT_ACTIVEX, wxActiveXEvent ); typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&); #define wxActiveXEventHandler(func) \ wxEVENT_HANDLER_CAST( wxActiveXEventFunction, func ) #define EVT_ACTIVEX(id, fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_ACTIVEX, id, -1, wxActiveXEventHandler( fn ), NULL ), #endif // wxUSE_ACTIVEX #endif // _WX_MSW_OLE_ACTIVEXCONTAINER_H_