+++ /dev/null
-/*
- wxActiveX Library Licence, Version 3
- ====================================
-
- Copyright (C) 2003 Lindsay Mathieson [, ...]
-
- Everyone is permitted to copy and distribute verbatim copies
- of this licence document, but changing it is not allowed.
-
- wxActiveX LIBRARY LICENCE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- This library is free software; you can redistribute it and/or modify it
- under the terms of the GNU Library General Public Licence as published by
- the Free Software Foundation; either version 2 of the Licence, or (at
- your option) any later version.
-
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
- General Public Licence for more details.
-
- You should have received a copy of the GNU Library General Public Licence
- along with this software, usually in a file named COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- Boston, MA 02111-1307 USA.
-
- EXCEPTION NOTICE
-
- 1. As a special exception, the copyright holders of this library give
- permission for additional uses of the text contained in this release of
- the library as licenced under the wxActiveX Library Licence, applying
- either version 3 of the Licence, or (at your option) any later version of
- the Licence as published by the copyright holders of version 3 of the
- Licence document.
-
- 2. The exception is that you may use, copy, link, modify and distribute
- under the user's own terms, binary object code versions of works based
- on the Library.
-
- 3. If you copy code from files distributed under the terms of the GNU
- General Public Licence or the GNU Library General Public Licence into a
- copy of this library, as this licence permits, the exception does not
- apply to the code that you add in this way. To avoid misleading anyone as
- to the status of such modified files, you must delete this exception
- notice from such code and/or adjust the licensing conditions notice
- accordingly.
-
- 4. If you write modifications of your own for this library, it is your
- choice whether to permit this exception to apply to your modifications.
- If you do not wish that, you must delete the exception notice from such
- code and/or adjust the licensing conditions notice accordingly.
-*/
-
-/*! \file wxactivex.h
- \brief implements wxActiveX window class and OLE tools
-*/
-
-#ifndef WX_ACTIVE_X
-#define WX_ACTIVE_X
-#pragma warning( disable : 4101 4786)
-#pragma warning( disable : 4786)
-
-
-#include <wx/setup.h>
-#include <wx/wx.h>
-#include <wx/variant.h>
-#include <wx/datetime.h>
-#include <oleidl.h>
-#include <exdisp.h>
-#include <docobj.h>
-#include <iostream>
-#include <vector>
-#include <map>
-using namespace std;
-
-/// \brief wxActiveX Namespace for stuff I want to keep out of other tools way.
-namespace NS_wxActiveX
-{
- /// STL utilty class.
- /// specific to wxActiveX, for creating
- /// case insenstive maps etc
- struct less_wxStringI
- {
- bool operator()(const wxString& x, const wxString& y) const
- {
- return x.CmpNoCase(y) < 0;
- };
- };
-};
-
-
-//////////////////////////////////////////
-/// Template class for smart interface handling.
-/// - Automatically dereferences ole interfaces
-/// - Smart Copy Semantics
-/// - Can Create Interfaces
-/// - Can query for other interfaces
-template <class I> class wxAutoOleInterface
-{
- protected:
- I *m_interface;
-
- public:
- /// takes ownership of an existing interface
- /// Assumed to already have a AddRef() applied
- explicit wxAutoOleInterface(I *pInterface = NULL) : m_interface(pInterface) {}
-
- /// queries for an interface
- wxAutoOleInterface(REFIID riid, IUnknown *pUnk) : m_interface(NULL)
- {
- QueryInterface(riid, pUnk);
- };
- /// queries for an interface
- wxAutoOleInterface(REFIID riid, IDispatch *pDispatch) : m_interface(NULL)
- {
- QueryInterface(riid, pDispatch);
- };
-
- /// Creates an Interface
- wxAutoOleInterface(REFCLSID clsid, REFIID riid) : m_interface(NULL)
- {
- CreateInstance(clsid, riid);
- };
-
- /// copy constructor
- wxAutoOleInterface(const wxAutoOleInterface<I>& ti) : m_interface(NULL)
- {
- operator = (ti);
- }
-
- /// assignment operator
- wxAutoOleInterface<I>& operator = (const wxAutoOleInterface<I>& ti)
- {
- if (ti.m_interface)
- ti.m_interface->AddRef();
- Free();
- m_interface = ti.m_interface;
- return *this;
- }
-
- /// takes ownership of an existing interface
- /// Assumed to already have a AddRef() applied
- wxAutoOleInterface<I>& operator = (I *&ti)
- {
- Free();
- m_interface = ti;
- return *this;
- }
-
- /// invokes Free()
- ~wxAutoOleInterface()
- {
- Free();
- };
-
-
- /// Releases interface (i.e decrements refCount)
- inline void Free()
- {
- if (m_interface)
- m_interface->Release();
- m_interface = NULL;
- };
-
- /// queries for an interface
- HRESULT QueryInterface(REFIID riid, IUnknown *pUnk)
- {
- Free();
- wxCHECK(pUnk != NULL, -1);
- return pUnk->QueryInterface(riid, (void **) &m_interface);
- };
-
- /// Create a Interface instance
- HRESULT CreateInstance(REFCLSID clsid, REFIID riid)
- {
- Free();
- return CoCreateInstance(clsid, NULL, CLSCTX_ALL, riid, (void **) &m_interface);
- };
-
-
- /// returns the interface pointer
- inline operator I *() const {return m_interface;}
-
- /// returns the dereferenced interface pointer
- inline I* operator ->() {return m_interface;}
- /// returns a pointer to the interface pointer
- inline I** GetRef() {return &m_interface;}
- /// returns true if we have a valid interface pointer
- inline bool Ok() const {return m_interface != NULL;}
-};
-
-
-/// \brief Converts a std HRESULT to its error code.
-/// Hardcoded, by no means a definitive list.
-wxString OLEHResultToString(HRESULT hr);
-/// \brief Returns the string description of a IID.
-/// Hardcoded, by no means a definitive list.
-wxString GetIIDName(REFIID riid);
-
-//#define __WXOLEDEBUG
-
-
-#ifdef __WXOLEDEBUG
- #define WXOLE_TRACE(str) {OutputDebugString(str);OutputDebugString("\r\n");}
- #define WXOLE_TRACEOUT(stuff)\
- {\
- wxString os;\
- os << stuff << "\r\n";\
- WXOLE_TRACE(os.mb_str());\
- }
-
- #define WXOLE_WARN(__hr,msg)\
- {\
- if (__hr != S_OK)\
- {\
- wxString s = "*** ";\
- s += msg;\
- s += " : "+ OLEHResultToString(__hr);\
- WXOLE_TRACE(s.c_str());\
- }\
- }
-#else
- #define WXOLE_TRACE(str)
- #define WXOLE_TRACEOUT(stuff)
- #define WXOLE_WARN(_proc,msg) {_proc;}
-#endif
-
-class wxOleInit
-{
- public:
- static IMalloc *GetIMalloc();
-
- wxOleInit();
- ~wxOleInit();
-};
-
-#define DECLARE_OLE_UNKNOWN(cls)\
- private:\
- class TAutoInitInt\
- {\
- public:\
- LONG l;\
- TAutoInitInt() : l(0) {}\
- };\
- TAutoInitInt refCount, lockCount;\
- wxOleInit oleInit;\
- static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\
- public:\
- LONG GetRefCount();\
- HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);\
- ULONG STDMETHODCALLTYPE AddRef();\
- ULONG STDMETHODCALLTYPE Release();\
- ULONG STDMETHODCALLTYPE AddLock();\
- ULONG STDMETHODCALLTYPE ReleaseLock()
-
-#define DEFINE_OLE_TABLE(cls)\
- LONG cls::GetRefCount() {return refCount.l;}\
- HRESULT STDMETHODCALLTYPE cls::QueryInterface(REFIID iid, void ** ppvObject)\
- {\
- if (! ppvObject)\
- {\
- WXOLE_TRACE("*** NULL POINTER ***");\
- return E_FAIL;\
- };\
- const char *desc = NULL;\
- cls::_GetInterface(this, iid, ppvObject, desc);\
- if (! *ppvObject)\
- {\
- WXOLE_TRACEOUT("<" << GetIIDName(iid).c_str() << "> Not Found");\
- return E_NOINTERFACE;\
- };\
- WXOLE_TRACEOUT("QI : <" << desc <<">");\
- ((IUnknown * )(*ppvObject))->AddRef();\
- return S_OK;\
- };\
- ULONG STDMETHODCALLTYPE cls::AddRef()\
- {\
- WXOLE_TRACEOUT(# cls << "::Add ref(" << refCount.l << ")");\
- InterlockedIncrement(&refCount.l);\
- return refCount.l;\
- };\
- ULONG STDMETHODCALLTYPE cls::Release()\
- {\
- if (refCount.l > 0)\
- {\
- InterlockedDecrement(&refCount.l);\
- WXOLE_TRACEOUT(# cls << "::Del ref(" << refCount.l << ")");\
- if (refCount.l == 0)\
- {\
- delete this;\
- return 0;\
- };\
- return refCount.l;\
- }\
- else\
- return 0;\
- }\
- ULONG STDMETHODCALLTYPE cls::AddLock()\
- {\
- WXOLE_TRACEOUT(# cls << "::Add Lock(" << lockCount.l << ")");\
- InterlockedIncrement(&lockCount.l);\
- return lockCount.l;\
- };\
- ULONG STDMETHODCALLTYPE cls::ReleaseLock()\
- {\
- if (lockCount.l > 0)\
- {\
- InterlockedDecrement(&lockCount.l);\
- WXOLE_TRACEOUT(# cls << "::Del Lock(" << lockCount.l << ")");\
- return lockCount.l;\
- }\
- else\
- return 0;\
- }\
- DEFINE_OLE_BASE(cls)
-
-#define DEFINE_OLE_BASE(cls)\
- void cls::_GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc)\
- {\
- *_interface = NULL;\
- desc = NULL;
-
-#define OLE_INTERFACE(_iid, _type)\
- if (IsEqualIID(iid, _iid))\
- {\
- WXOLE_TRACE("Found Interface <" # _type ">");\
- *_interface = (IUnknown *) (_type *) self;\
- desc = # _iid;\
- return;\
- }
-
-#define OLE_IINTERFACE(_face) OLE_INTERFACE(IID_##_face, _face)
-
-#define OLE_INTERFACE_CUSTOM(func)\
- if (func(self, iid, _interface, desc))\
- {\
- return;\
- }
-
-#define END_OLE_TABLE\
- }
-
-
-/// Main class for embedding a ActiveX control.
-/// Use by itself or derive from it
-/// \note The utility program (wxie) can generate a list of events, methods & properties
-/// for a control.
-/// First display the control (File|Display),
-/// then get the type info (ActiveX|Get Type Info) - these are copied to the clipboard.
-/// Eventually this will be expanded to autogenerate
-/// wxWindows source files for a control with all methods etc encapsulated.
-/// \par Usage:
-/// construct using a ProgId or class id
-/// \code new wxActiveX(parent, CLSID_WebBrowser, id, pos, size, style, name)\endcode
-/// \code new wxActiveX(parent, "ShockwaveFlash.ShockwaveFlash", id, pos, size, style, name)\endcode
-/// \par Properties
-/// Properties can be set using \c SetProp() and set/retrieved using \c Prop()
-/// \code SetProp(name, wxVariant(x)) \endcode or
-/// \code wxString Prop("<name>") = x\endcode
-/// \code wxString result = Prop("<name>")\endcode
-/// \code flash_ctl.Prop("movie") = "file:///movies/test.swf";\endcode
-/// \code flash_ctl.Prop("Playing") = false;\endcode
-/// \code wxString current_movie = flash_ctl.Prop("movie");\endcode
-/// \par Methods
-/// Methods are invoked with \c CallMethod()
-/// \code wxVariant result = CallMethod("<name>", args, nargs = -1)\endcode
-/// \code wxVariant args[] = {0L, "file:///e:/dev/wxie/bug-zap.swf"};
-/// wxVariant result = X->CallMethod("LoadMovie", args);\endcode
-/// \par events
-/// respond to events with the
-/// \c EVT_ACTIVEX(controlId, eventName, handler) &
-/// \c EVT_ACTIVEX_DISPID(controlId, eventDispId, handler) macros
-/// \code
-/// BEGIN_EVENT_TABLE(wxIEFrame, wxFrame)
-/// EVT_ACTIVEX_DISPID(ID_MSHTML, DISPID_STATUSTEXTCHANGE, OnMSHTMLStatusTextChangeX)
-/// EVT_ACTIVEX(ID_MSHTML, "BeforeNavigate2", OnMSHTMLBeforeNavigate2X)
-/// EVT_ACTIVEX(ID_MSHTML, "TitleChange", OnMSHTMLTitleChangeX)
-/// EVT_ACTIVEX(ID_MSHTML, "NewWindow2", OnMSHTMLNewWindow2X)
-/// EVT_ACTIVEX(ID_MSHTML, "ProgressChange", OnMSHTMLProgressChangeX)
-/// END_EVENT_TABLE()\endcode
-class wxActiveX : public wxWindow {
-public:
- /// General parameter and return type infoformation for Events, Properties and Methods.
- /// refer to ELEMDESC, IDLDESC in MSDN
- class ParamX
- {
- public:
- USHORT flags;
- bool isPtr;
- bool isSafeArray;
- bool isOptional;
- VARTYPE vt;
- wxString name;
-
- ParamX() : isOptional(false), vt(VT_EMPTY) {}
- inline bool IsIn() const {return (flags & IDLFLAG_FIN) != 0;}
- inline bool IsOut() const {return (flags & IDLFLAG_FOUT) != 0;}
- inline bool IsRetVal() const {return (flags & IDLFLAG_FRETVAL) != 0;}
- };
- typedef vector<ParamX> ParamXArray;
-
-
- /// Type & Parameter info for Events and Methods.
- /// refer to FUNCDESC in MSDN
- class FuncX
- {
- public:
- wxString name;
- MEMBERID memid;
- bool hasOut;
-
- ParamX retType;
- ParamXArray params;
- };
- typedef vector<FuncX> FuncXArray;
-
-
- /// Type info for properties.
- class PropX
- {
- public:
- wxString name;
- MEMBERID memid;
- ParamX type;
- ParamX arg;
- bool putByRef;
-
- PropX() : putByRef (false) {}
- inline bool CanGet() const {return type.vt != VT_EMPTY;}
- inline bool CanSet() const {return arg.vt != VT_EMPTY;}
- };
- typedef vector<PropX> PropXArray;
-
-
- /// Create using clsid.
- wxActiveX(wxWindow * parent, REFCLSID clsid, wxWindowID id = -1,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = 0,
- const wxString& name = wxPanelNameStr);
- /// create using progid.
- wxActiveX(wxWindow * parent, const wxString& progId, wxWindowID id = -1,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = 0,
- const wxString& name = wxPanelNameStr);
- virtual ~wxActiveX();
-
- /// Number of events defined for this control.
- inline int GetEventCount() const {return m_events.size();}
- /// returns event description by index.
- /// throws exception for invalid index
- const FuncX& GetEventDesc(int idx) const;
-
- /// Number of properties defined for this control.
- inline int GetPropCount() const {return m_props.size();}
- /// returns property description by index.
- /// throws exception for invalid index
- const PropX& GetPropDesc(int idx) const;
- /// returns property description by name.
- /// throws exception for invalid name
- const PropX& GetPropDesc(const wxString& name) const;
-
- /// Number of methods defined for this control.
- inline int GetMethodCount() const {return m_methods.size();}
- /// returns method description by name.
- /// throws exception for invalid index
- const FuncX& GetMethodDesc(int idx) const;
- /// returns method description by name.
- /// throws exception for invalid name
- const FuncX& GetMethodDesc(const wxString& name) const;
-
- /// Set property VARIANTARG value by MEMBERID.
- void SetProp(MEMBERID name, VARIANTARG& value);
- /// Set property using wxVariant by name.
- void SetProp(const wxString &name, const wxVariant &value);
-
- class wxPropertySetter
- {
- public:
- wxActiveX *m_ctl;
- wxString m_propName;
-
- wxPropertySetter(wxActiveX *ctl, const wxString& propName) :
- m_ctl(ctl), m_propName(propName) {}
-
- inline const wxPropertySetter& operator = (wxVariant v) const
- {
- m_ctl->SetProp(m_propName, v);
- return *this;
- };
-
- inline operator wxVariant() const {return m_ctl->GetPropAsWxVariant(m_propName);};
- inline operator wxString() const {return m_ctl->GetPropAsString(m_propName);};
- inline operator char() const {return m_ctl->GetPropAsChar(m_propName);};
- inline operator long() const {return m_ctl->GetPropAsLong(m_propName);};
- inline operator bool() const {return m_ctl->GetPropAsBool(m_propName);};
- inline operator double() const {return m_ctl->GetPropAsDouble(m_propName);};
- inline operator wxDateTime() const {return m_ctl->GetPropAsDateTime(m_propName);};
- inline operator void *() const {return m_ctl->GetPropAsPointer(m_propName);};
- };
-
- /// \fn inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
- /// \param name Property name to read/set
- /// \return wxPropertySetter, which has overloads for setting/getting the property
- /// \brief Generic Get/Set Property by name.
- /// Automatically handles most types
- /// \par Usage:
- /// - Prop("\<name\>") = \<value\>
- /// - var = Prop("\<name\>")
- /// - e.g:
- /// - \code flash_ctl.Prop("movie") = "file:///movies/test.swf";\endcode
- /// - \code flash_ctl.Prop("Playing") = false;\endcode
- /// - \code wxString current_movie = flash_ctl.Prop("movie");\endcode
- /// \exception raises exception if \<name\> is invalid
- /// \note Have to add a few more type conversions yet ...
- inline wxPropertySetter Prop(wxString name) {return wxPropertySetter(this, name);}
-
- VARIANT GetPropAsVariant(MEMBERID name);
- VARIANT GetPropAsVariant(const wxString& name);
- wxVariant GetPropAsWxVariant(const wxString& name);
- wxString GetPropAsString(const wxString& name);
- char GetPropAsChar(const wxString& name);
- long GetPropAsLong(const wxString& name);
- bool GetPropAsBool(const wxString& name);
- double GetPropAsDouble(const wxString& name);
- wxDateTime GetPropAsDateTime(const wxString& name);
- void *GetPropAsPointer(const wxString& name);
-
- // methods
- // VARIANTARG form is passed straight to Invoke,
- // so args in *REVERSE* order
- VARIANT CallMethod(MEMBERID name, VARIANTARG args[], int argc);
- VARIANT CallMethod(const wxString& name, VARIANTARG args[] = NULL, int argc = -1);
- // args are in *NORMAL* order
- // args can be a single wxVariant or an array
- /// \fn wxVariant CallMethod(wxString name, wxVariant args[], int nargs = -1);
- /// \param name name of method to call
- /// \param args array of wxVariant's, defaults to NULL (no args)
- /// \param nargs number of arguments passed via args. Defaults to actual number of args for the method
- /// \return wxVariant
- /// \brief Call a method of the ActiveX control.
- /// Automatically handles most types
- /// \par Usage:
- /// - result = CallMethod("\<name\>", args, nargs)
- /// - e.g.
- /// - \code
- /// wxVariant args[] = {0L, "file:///e:/dev/wxie/bug-zap.swf"};
- /// wxVariant result = X->CallMethod("LoadMovie", args);\endcode
- /// \exception raises exception if \<name\> is invalid
- /// \note Since wxVariant has built in type conversion, most the std types can be passed easily
- wxVariant CallMethod(const wxString& name, wxVariant args[], int nargs = -1);
-
- HRESULT ConnectAdvise(REFIID riid, IUnknown *eventSink);
-
- void OnSize(wxSizeEvent&);
- void OnPaint(wxPaintEvent& event);
- void OnMouse(wxMouseEvent& event);
- void OnSetFocus(wxFocusEvent&);
- void OnKillFocus(wxFocusEvent&);
-
- DECLARE_EVENT_TABLE();
-
-protected:
- friend class FrameSite;
- friend class wxActiveXEvents;
-
- unsigned long m_pdwRegister;
-
- typedef map<MEMBERID, int> MemberIdMap;
- typedef map<wxString, int, NS_wxActiveX::less_wxStringI> NameMap;
-
- typedef wxAutoOleInterface<IConnectionPoint> wxOleConnectionPoint;
- typedef pair<wxOleConnectionPoint, DWORD> wxOleConnection;
- typedef vector<wxOleConnection> wxOleConnectionArray;
-
- wxAutoOleInterface<IDispatch> m_Dispatch;
- wxAutoOleInterface<IOleClientSite> m_clientSite;
- wxAutoOleInterface<IUnknown> m_ActiveX;
- wxAutoOleInterface<IOleObject> m_oleObject;
- wxAutoOleInterface<IOleInPlaceObject> m_oleInPlaceObject;
- wxAutoOleInterface<IOleInPlaceActiveObject>
-
- m_oleInPlaceActiveObject;
- wxAutoOleInterface<IOleDocumentView> m_docView;
- wxAutoOleInterface<IViewObject> m_viewObject;
- HWND m_oleObjectHWND;
- bool m_bAmbientUserMode;
- DWORD m_docAdviseCookie;
- wxOleConnectionArray m_connections;
-
- void CreateActiveX(REFCLSID clsid);
- void CreateActiveX(LPOLESTR progId);
- HRESULT AmbientPropertyChanged(DISPID dispid);
-
- void GetTypeInfo();
- void GetTypeInfo(ITypeInfo *ti, bool defInterface, bool defEventSink);
-
-
- // events
- FuncXArray m_events;
- MemberIdMap m_eventMemberIds;
-
- // properties
- PropXArray m_props;
- NameMap m_propNames;
-
- // Methods
- FuncXArray m_methods;
- NameMap m_methodNames;
-
- virtual bool MSWTranslateMessage(WXMSG* pMsg);
- long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
-
- DECLARE_CLASS(wxActiveX)
-};
-
-// events
-class wxActiveXEvent : public wxCommandEvent
-{
-private:
- friend class wxActiveXEvents;
-
- wxVariant m_params;
-
-public:
-
- virtual wxEvent *Clone() const { return new wxActiveXEvent(*this); }
-
- wxString EventName();
- int ParamCount() const;
- wxString ParamType(int idx);
- wxString ParamName(int idx);
- wxVariant& operator[] (int idx);
- wxVariant& operator[] (wxString name);
-
-private:
- DECLARE_CLASS(wxActiveXEvent)
-};
-
-const wxEventType& RegisterActiveXEvent(const wxChar *eventName);
-const wxEventType& RegisterActiveXEvent(DISPID event);
-
-typedef void (wxEvtHandler::*wxActiveXEventFunction)(wxActiveXEvent&);
-
-/// \def EVT_ACTIVEX(id, eventName, fn)
-/// \brief Event handle for events by name
-#define EVT_ACTIVEX(id, eventName, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(wxT(eventName)), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
-/// \def EVT_ACTIVEX_DISPID(id, eventDispId, fn)
-/// \brief Event handle for events by DISPID (dispath id)
-#define EVT_ACTIVEX_DISPID(id, eventDispId, fn) DECLARE_EVENT_TABLE_ENTRY(RegisterActiveXEvent(eventDispId), id, -1, (wxObjectEventFunction) (wxEventFunction) (wxActiveXEventFunction) & fn, (wxObject *) NULL ),
-
-//util
-bool wxDateTimeToVariant(wxDateTime dt, VARIANTARG& va);
-bool VariantToWxDateTime(VARIANTARG va, wxDateTime& dt);
-/// \relates wxActiveX
-/// \fn bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
-/// \param va VARAIANTARG to convert from
-/// \param vx Destination wxVariant
-/// \return success/failure (true/false)
-/// \brief Convert MSW VARIANTARG to wxVariant.
-/// Handles basic types, need to add:
-/// - VT_ARRAY | VT_*
-/// - better support for VT_UNKNOWN (currently treated as void *)
-/// - better support for VT_DISPATCH (currently treated as void *)
-bool MSWVariantToVariant(VARIANTARG& va, wxVariant& vx);
-/// \relates wxActiveX
-/// \fn bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
-/// \param vx wxVariant to convert from
-/// \param va Destination VARIANTARG
-/// \return success/failure (true/false)
-/// \brief Convert wxVariant to MSW VARIANTARG.
-/// Handles basic types, need to add:
-/// - VT_ARRAY | VT_*
-/// - better support for VT_UNKNOWN (currently treated as void *)
-/// - better support for VT_DISPATCH (currently treated as void *)
-bool VariantToMSWVariant(const wxVariant& vx, VARIANTARG& va);
-
-#endif /* _IEHTMLWIN_H_ */