Main Page   Namespace List   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

wxactivex.h

Go to the documentation of this file.
00001 
00005 #ifndef WX_ACTIVE_X
00006 #define WX_ACTIVE_X
00007 #pragma warning( disable : 4101 4786)
00008 #pragma warning( disable : 4786)
00009 
00010 
00011 #include <wx/setup.h>
00012 #include <wx/wx.h>
00013 #include <wx/variant.h>
00014 #include <wx/datetime.h>
00015 #include <oleidl.h>
00016 #include <exdisp.h>
00017 #include <docobj.h>
00018 #include <iostream>
00019 #include <vector>
00020 #include <map>
00021 using namespace std;
00022 
00024 namespace NS_wxActiveX
00025 {
00029         struct less_wxStringI
00030         {
00031                 bool operator()(const wxString& x, const wxString& y) const
00032                 {
00033                         return x.CmpNoCase(y) < 0;
00034                 };
00035         };
00036 };
00037 
00038 
00045 template <class I> class wxAutoOleInterface
00046 {
00047         protected:
00048     I *m_interface;
00049 
00050         public:
00053     explicit wxAutoOleInterface(I *pInterface = NULL) : m_interface(pInterface) {}
00054 
00056     wxAutoOleInterface(REFIID riid, IUnknown *pUnk) : m_interface(NULL)
00057         {
00058                 QueryInterface(riid, pUnk);
00059         };
00061     wxAutoOleInterface(REFIID riid, IDispatch *pDispatch) : m_interface(NULL)
00062         {
00063                 QueryInterface(riid, pDispatch);
00064         };
00065 
00067         wxAutoOleInterface(REFCLSID clsid, REFIID riid) : m_interface(NULL)
00068         {
00069                 CreateInstance(clsid, riid);
00070         };
00071 
00073     wxAutoOleInterface(const wxAutoOleInterface<I>& ti) : m_interface(NULL)
00074     {
00075                 operator = (ti);
00076     }
00077 
00079     wxAutoOleInterface<I>& operator = (const wxAutoOleInterface<I>& ti)
00080     {
00081                 if (ti.m_interface)
00082                         ti.m_interface->AddRef();
00083         Free();
00084         m_interface = ti.m_interface;
00085         return *this;
00086     }
00087 
00090     wxAutoOleInterface<I>& operator = (I *&ti)
00091     {
00092         Free();
00093         m_interface = ti;
00094         return *this;
00095     }
00096 
00098     ~wxAutoOleInterface()
00099     {
00100         Free();
00101     };
00102 
00103 
00105     inline void Free()
00106     {
00107         if (m_interface)
00108                 m_interface->Release();
00109         m_interface = NULL;
00110     };
00111 
00113     HRESULT QueryInterface(REFIID riid, IUnknown *pUnk)
00114         {
00115                 Free();
00116                 wxASSERT(pUnk != NULL);
00117             return pUnk->QueryInterface(riid, (void **) &m_interface);
00118         };
00119 
00121     HRESULT CreateInstance(REFCLSID clsid, REFIID riid)
00122     {
00123                 Free();
00124             return CoCreateInstance(clsid, NULL, CLSCTX_ALL, riid, (void **) &m_interface);
00125     };
00126 
00127 
00129     inline operator I *() const {return m_interface;}
00130 
00132     inline I* operator ->() {return m_interface;}
00134         inline I** GetRef()     {return &m_interface;}
00136         inline bool Ok() const  {return m_interface != NULL;}
00137 };
00138 
00139 
00142 wxString OLEHResultToString(HRESULT hr);
00145 wxString GetIIDName(REFIID riid);
00146 
00147 //#define __WXOLEDEBUG
00148 
00149 
00150 #ifdef __WXOLEDEBUG
00151     #define WXOLE_TRACE(str) {OutputDebugString(str);OutputDebugString("\r\n");}
00152     #define WXOLE_TRACEOUT(stuff)\
00153     {\
00154         wxString os;\
00155         os << stuff << "\r\n";\
00156         WXOLE_TRACE(os.mb_str());\
00157     }
00158 
00159     #define WXOLE_WARN(__hr,msg)\
00160     {\
00161         if (__hr != S_OK)\
00162         {\
00163             wxString s = "*** ";\
00164             s += msg;\
00165             s += " : "+ OLEHResultToString(__hr);\
00166             WXOLE_TRACE(s.c_str());\
00167         }\
00168     }
00169 #else
00170     #define WXOLE_TRACE(str)
00171     #define WXOLE_TRACEOUT(stuff)
00172     #define WXOLE_WARN(_proc,msg) {_proc;}
00173 #endif
00174 
00175 class wxOleInit
00176 {
00177         public:
00178     static IMalloc *GetIMalloc();
00179 
00180     wxOleInit();
00181     ~wxOleInit();
00182 };
00183 
00184 #define DECLARE_OLE_UNKNOWN(cls)\
00185         private:\
00186     class TAutoInitInt\
00187     {\
00188         public:\
00189         LONG l;\
00190         TAutoInitInt() : l(0) {}\
00191     };\
00192     TAutoInitInt refCount, lockCount;\
00193     wxOleInit oleInit;\
00194         static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\
00195     public:\
00196     LONG GetRefCount();\
00197         HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);\
00198         ULONG STDMETHODCALLTYPE AddRef();\
00199         ULONG STDMETHODCALLTYPE Release();\
00200     ULONG STDMETHODCALLTYPE AddLock();\
00201         ULONG STDMETHODCALLTYPE ReleaseLock()
00202 
00203 #define DEFINE_OLE_TABLE(cls)\
00204         LONG cls::GetRefCount() {return refCount.l;}\
00205     HRESULT STDMETHODCALLTYPE cls::QueryInterface(REFIID iid, void ** ppvObject)\
00206     {\
00207         if (! ppvObject)\
00208         {\
00209             WXOLE_TRACE("*** NULL POINTER ***");\
00210             return E_FAIL;\
00211         };\
00212         const char *desc = NULL;\
00213         cls::_GetInterface(this, iid, ppvObject, desc);\
00214         if (! *ppvObject)\
00215         {\
00216             WXOLE_TRACEOUT("<" << GetIIDName(iid).c_str() << "> Not Found");\
00217             return E_NOINTERFACE;\
00218         };\
00219         WXOLE_TRACEOUT("QI : <" << desc <<">");\
00220         ((IUnknown * )(*ppvObject))->AddRef();\
00221         return S_OK;\
00222     };\
00223     ULONG STDMETHODCALLTYPE cls::AddRef()\
00224     {\
00225         WXOLE_TRACEOUT(# cls << "::Add ref(" << refCount.l << ")");\
00226         InterlockedIncrement(&refCount.l);\
00227         return refCount.l;\
00228     };\
00229     ULONG STDMETHODCALLTYPE cls::Release()\
00230     {\
00231         if (refCount.l > 0)\
00232         {\
00233                 InterlockedDecrement(&refCount.l);\
00234                 WXOLE_TRACEOUT(# cls << "::Del ref(" << refCount.l << ")");\
00235             if (refCount.l == 0)\
00236                 {\
00237                 delete this;\
00238                     return 0;\
00239                 };\
00240                 return refCount.l;\
00241         }\
00242         else\
00243                 return 0;\
00244     }\
00245     ULONG STDMETHODCALLTYPE cls::AddLock()\
00246     {\
00247         WXOLE_TRACEOUT(# cls << "::Add Lock(" << lockCount.l << ")");\
00248         InterlockedIncrement(&lockCount.l);\
00249         return lockCount.l;\
00250     };\
00251     ULONG STDMETHODCALLTYPE cls::ReleaseLock()\
00252     {\
00253         if (lockCount.l > 0)\
00254         {\
00255                 InterlockedDecrement(&lockCount.l);\
00256                 WXOLE_TRACEOUT(# cls << "::Del Lock(" << lockCount.l << ")");\
00257             return lockCount.l;\
00258         }\
00259         else\
00260                 return 0;\
00261     }\
00262     DEFINE_OLE_BASE(cls)
00263 
00264 #define DEFINE_OLE_BASE(cls)\
00265         void cls::_GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc)\
00266         {\
00267                 *_interface = NULL;\
00268             desc = NULL;
00269 
00270 #define OLE_INTERFACE(_iid, _type)\
00271     if (IsEqualIID(iid, _iid))\
00272     {\
00273         WXOLE_TRACE("Found Interface <" # _type ">");\
00274         *_interface = (IUnknown *) (_type *) self;\
00275         desc = # _iid;\
00276         return;\
00277     }
00278 
00279 #define OLE_IINTERFACE(_face) OLE_INTERFACE(IID_##_face, _face)
00280 
00281 #define OLE_INTERFACE_CUSTOM(func)\
00282     if (func(self, iid, _interface, desc))\
00283         {\
00284         return;\
00285         }
00286 
00287 #define END_OLE_TABLE\
00288         }
00289 
00290 
00328 
00329 class wxActiveX : public wxWindow {
00330 public:
00333         class ParamX 
00334         {
00335         public:
00336                 USHORT      flags;
00337         bool isPtr, isSafeArray;
00338                 VARTYPE     vt;
00339         wxString    name;
00340 
00341         ParamX() : vt(VT_EMPTY) {}
00342                 inline bool IsIn() const                {return (flags & IDLFLAG_FIN) != 0;}
00343                 inline bool IsOut() const               {return (flags & IDLFLAG_FOUT) != 0;}
00344                 inline bool IsRetVal() const    {return (flags & IDLFLAG_FRETVAL) != 0;}
00345         };
00346         typedef vector<ParamX>  ParamXArray;
00347 
00350     class FuncX 
00351     {
00352     public:
00353         wxString    name;
00354         MEMBERID    memid;
00355                 bool            hasOut;
00356 
00357         ParamX      retType;
00358                 ParamXArray     params;
00359     };
00360 
00362         class PropX
00363         {
00364         public:
00365                 wxString        name;
00366         MEMBERID    memid;
00367         ParamX      type;
00368         ParamX      arg;
00369                 bool            putByRef;
00370 
00371                 PropX() : putByRef (false) {}
00372                 inline bool CanGet() const {return type.vt != VT_EMPTY;}
00373                 inline bool CanSet() const {return arg.vt != VT_EMPTY;}
00374         };
00375 
00377     wxActiveX(wxWindow * parent, REFCLSID clsid, wxWindowID id = -1,
00378         const wxPoint& pos = wxDefaultPosition,
00379         const wxSize& size = wxDefaultSize,
00380         long style = 0,
00381         const wxString& name = wxPanelNameStr);
00383     wxActiveX(wxWindow * parent, wxString progId, wxWindowID id = -1,
00384         const wxPoint& pos = wxDefaultPosition,
00385         const wxSize& size = wxDefaultSize,
00386         long style = 0,
00387         const wxString& name = wxPanelNameStr);
00388         virtual ~wxActiveX();
00389 
00391     inline int GetEventCount() const {return m_events.size();}
00394     const FuncX& GetEventDesc(int idx) const;
00395 
00397     inline int GetPropCount() const {return m_props.size();}
00400     const PropX& GetPropDesc(int idx) const;
00403     const PropX& GetPropDesc(wxString name) const;
00404 
00406     inline int GetMethodCount() const {return m_methods.size();}
00409     const FuncX& GetMethodDesc(int idx) const;
00412     const FuncX& GetMethodDesc(wxString name) const;
00413 
00415     void SetProp(MEMBERID name, VARIANTARG& value);
00417     void SetProp(const wxString &name, const wxVariant &value);
00418     
00419     class wxPropertySetter
00420     {
00421     public:
00422         wxActiveX *m_ctl;
00423         wxString m_propName;
00424 
00425         wxPropertySetter(wxActiveX *ctl, wxString propName) : 
00426             m_ctl(ctl), m_propName(propName) {}
00427         
00428         inline const wxPropertySetter& operator = (wxVariant v) const
00429         {
00430             m_ctl->SetProp(m_propName, v);
00431             return *this;
00432         };
00433 
00434         inline operator wxVariant() const   {return m_ctl->GetPropAsWxVariant(m_propName);};
00435         inline operator wxString() const    {return m_ctl->GetPropAsString(m_propName);};
00436         inline operator char() const        {return m_ctl->GetPropAsChar(m_propName);};
00437         inline operator long() const        {return m_ctl->GetPropAsLong(m_propName);};
00438         inline operator bool() const        {return m_ctl->GetPropAsBool(m_propName);};
00439         inline operator double() const      {return m_ctl->GetPropAsDouble(m_propName);};
00440         inline operator wxDateTime() const  {return m_ctl->GetPropAsDateTime(m_propName);};
00441         inline operator void *() const      {return m_ctl->GetPropAsPointer(m_propName);};
00442     };
00443 
00458     inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
00459 
00460     VARIANT GetPropAsVariant(MEMBERID name);
00461     VARIANT GetPropAsVariant(const wxString& name);
00462     wxVariant GetPropAsWxVariant(const wxString& name);
00463     wxString GetPropAsString(const wxString& name);
00464     char GetPropAsChar(const wxString& name);
00465     long GetPropAsLong(const wxString& name);
00466     bool GetPropAsBool(const wxString& name);
00467     double GetPropAsDouble(const wxString& name);
00468     wxDateTime GetPropAsDateTime(const wxString& name);
00469     void *GetPropAsPointer(const wxString& name);
00470 
00471     // methods
00472     // VARIANTARG form is passed straight to Invoke, 
00473     // so args in *REVERSE* order
00474     VARIANT CallMethod(MEMBERID name, VARIANTARG args[], int argc);
00475     VARIANT CallMethod(wxString name, VARIANTARG args[] = NULL, int argc = -1);
00476     // args are in *NORMAL* order
00477     // args can be a single wxVariant or an array
00493     wxVariant CallMethod(wxString name, wxVariant args[], int nargs = -1);
00494 
00495         HRESULT ConnectAdvise(REFIID riid, IUnknown *eventSink);
00496 
00497         void OnSize(wxSizeEvent&);
00498     void OnPaint(wxPaintEvent& event);
00499     void OnMouse(wxMouseEvent& event);
00500         void OnSetFocus(wxFocusEvent&);
00501     void OnKillFocus(wxFocusEvent&);
00502 
00503         DECLARE_EVENT_TABLE();
00504 
00505 protected:
00506     friend class FrameSite;
00507     friend class wxActiveXEvents;
00508 
00509         typedef map<MEMBERID, FuncX>    FuncXMap;
00510     typedef map<wxString, FuncX, NS_wxActiveX::less_wxStringI>  FuncXStringMap;
00511         typedef map<wxString, PropX, NS_wxActiveX::less_wxStringI> PropXMap;
00512         typedef wxAutoOleInterface<IConnectionPoint>    wxOleConnectionPoint;
00513         typedef pair<wxOleConnectionPoint, DWORD>               wxOleConnection;
00514         typedef vector<wxOleConnection>                                 wxOleConnectionArray;
00515 
00516         wxAutoOleInterface<IDispatch>                   m_Dispatch;
00517     wxAutoOleInterface<IOleClientSite>      m_clientSite;
00518     wxAutoOleInterface<IUnknown>            m_ActiveX;
00519         wxAutoOleInterface<IOleObject>                  m_oleObject;
00520         wxAutoOleInterface<IOleInPlaceObject>   m_oleInPlaceObject;
00521     wxAutoOleInterface<IOleInPlaceActiveObject>
00522 
00523                                             m_oleInPlaceActiveObject;
00524     wxAutoOleInterface<IOleDocumentView>        m_docView;
00525     wxAutoOleInterface<IViewObject>             m_viewObject;
00526         HWND m_oleObjectHWND;
00527     bool m_bAmbientUserMode;
00528     DWORD m_docAdviseCookie;
00529         wxOleConnectionArray                                    m_connections;
00530 
00531         void CreateActiveX(REFCLSID clsid);
00532     void CreateActiveX(LPOLESTR progId);
00533     HRESULT AmbientPropertyChanged(DISPID dispid);
00534 
00535         void GetTypeInfo();
00536         void GetTypeInfo(ITypeInfo *ti, bool defInterface, bool defEventSink);
00537 
00538 
00539     // events
00540     FuncXMap            m_events;
00541 
00542         // properties
00543         PropXMap                m_props;
00544 
00545     // Methods
00546     FuncXStringMap  m_methods;
00547 
00548     long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
00549 };
00550 
00551 // events
00552 class wxActiveXEvent : public wxCommandEvent
00553 {
00554 private:
00555     friend class wxActiveXEvents;
00556 
00557     wxVariant m_params;
00558 
00559 public:
00560 
00561     virtual wxEvent *Clone() const { return new wxActiveXEvent(*this); }
00562 
00563     wxString EventName();
00564     int ParamCount() const;
00565     wxString ParamType(int idx);
00566     wxString ParamName(int idx);
00567     wxVariant& operator[] (int idx);
00568     wxVariant& operator[] (wxString name);
00569 };
00570 
00571 const wxEventType& RegisterActiveXEvent(const wxChar *eventName);
00572 const wxEventType& RegisterActiveXEvent(DISPID event);
00573 
00574 typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&);
00575 
00578 #define EVT_ACTIVEX(id, eventName, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(wxT(eventName)), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
00581 #define EVT_ACTIVEX_DISPID(id, eventDispId, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(eventDispId), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
00582 
00583 //util
00584 bool wxDateTimeToVariant(wxDateTime dt, VARIANTARG& va);
00585 bool VariantToWxDateTime(VARIANTARG va, wxDateTime& dt);
00596 bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
00607 bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
00608 
00609 #endif /* _IEHTMLWIN_H_ */

Generated on Tue Apr 1 14:51:12 2003 for wxActiveX by doxygen1.3-rc3