2                 wxActiveX Library Licence, Version 3 
   3                 ==================================== 
   5   Copyright (C) 2003 Lindsay Mathieson [, ...] 
   7   Everyone is permitted to copy and distribute verbatim copies 
   8   of this licence document, but changing it is not allowed. 
  10                        wxActiveX LIBRARY LICENCE 
  11      TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 
  13   This library is free software; you can redistribute it and/or modify it 
  14   under the terms of the GNU Library General Public Licence as published by 
  15   the Free Software Foundation; either version 2 of the Licence, or (at 
  16   your option) any later version. 
  18   This library is distributed in the hope that it will be useful, but 
  19   WITHOUT ANY WARRANTY; without even the implied warranty of 
  20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library 
  21   General Public Licence for more details. 
  23   You should have received a copy of the GNU Library General Public Licence 
  24   along with this software, usually in a file named COPYING.LIB.  If not, 
  25   write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
  26   Boston, MA 02111-1307 USA. 
  30   1. As a special exception, the copyright holders of this library give 
  31   permission for additional uses of the text contained in this release of 
  32   the library as licenced under the wxActiveX Library Licence, applying 
  33   either version 3 of the Licence, or (at your option) any later version of 
  34   the Licence as published by the copyright holders of version 3 of the 
  37   2. The exception is that you may use, copy, link, modify and distribute 
  38   under the user's own terms, binary object code versions of works based 
  41   3. If you copy code from files distributed under the terms of the GNU 
  42   General Public Licence or the GNU Library General Public Licence into a 
  43   copy of this library, as this licence permits, the exception does not 
  44   apply to the code that you add in this way.  To avoid misleading anyone as 
  45   to the status of such modified files, you must delete this exception 
  46   notice from such code and/or adjust the licensing conditions notice 
  49   4. If you write modifications of your own for this library, it is your 
  50   choice whether to permit this exception to apply to your modifications.  
  51   If you do not wish that, you must delete the exception notice from such 
  52   code and/or adjust the licensing conditions notice accordingly. 
  55 #include "wxActiveX.h" 
  56 #include <wx/strconv.h> 
  58 #include <wx/string.h> 
  59 #include <wx/datetime.h> 
  67 // Depending on compilation mode, the wx headers may have undef'd 
  68 // this, but in this case we need it so the virtual method in 
  69 // FrameSite will match what is in oleidl.h. 
  72         #define GetObject GetObjectW 
  74         #define GetObject GetObjectA 
  79 ////////////////////////////////////////////////////////////////////// 
  80 BEGIN_EVENT_TABLE(wxActiveX
, wxWindow
) 
  81     EVT_SIZE(wxActiveX::OnSize
) 
  82     EVT_PAINT(wxActiveX::OnPaint
) 
  83     EVT_MOUSE_EVENTS(wxActiveX::OnMouse
) 
  84     EVT_SET_FOCUS(wxActiveX::OnSetFocus
) 
  85     EVT_KILL_FOCUS(wxActiveX::OnKillFocus
) 
  88 IMPLEMENT_CLASS(wxActiveX
, wxWindow
) 
  93     public IOleClientSite
, 
  94     public IOleInPlaceSiteEx
, 
  95     public IOleInPlaceFrame
, 
  96     public IOleItemContainer
, 
  98     public IOleCommandTarget
, 
  99     public IOleDocumentSite
, 
 101     public IOleControlSite
 
 104     DECLARE_OLE_UNKNOWN(FrameSite
); 
 107     FrameSite(wxActiveX 
* win
); 
 108     virtual ~FrameSite(); 
 111     STDMETHODIMP 
GetWindow(HWND
*); 
 112     STDMETHODIMP 
ContextSensitiveHelp(BOOL
); 
 114     //IOleInPlaceUIWindow 
 115     STDMETHODIMP 
GetBorder(LPRECT
); 
 116     STDMETHODIMP 
RequestBorderSpace(LPCBORDERWIDTHS
); 
 117     STDMETHODIMP 
SetBorderSpace(LPCBORDERWIDTHS
); 
 118     STDMETHODIMP 
SetActiveObject(IOleInPlaceActiveObject
*, LPCOLESTR
); 
 121     STDMETHODIMP 
InsertMenus(HMENU
, LPOLEMENUGROUPWIDTHS
); 
 122     STDMETHODIMP 
SetMenu(HMENU
, HOLEMENU
, HWND
); 
 123     STDMETHODIMP 
RemoveMenus(HMENU
); 
 124     STDMETHODIMP 
SetStatusText(LPCOLESTR
); 
 125     STDMETHODIMP 
EnableModeless(BOOL
); 
 126     STDMETHODIMP 
TranslateAccelerator(LPMSG
, WORD
); 
 129     STDMETHODIMP 
CanInPlaceActivate(); 
 130     STDMETHODIMP 
OnInPlaceActivate(); 
 131     STDMETHODIMP 
OnUIActivate(); 
 132     STDMETHODIMP 
GetWindowContext(IOleInPlaceFrame
**, IOleInPlaceUIWindow
**,  
 133         LPRECT
, LPRECT
, LPOLEINPLACEFRAMEINFO
); 
 134     STDMETHODIMP 
Scroll(SIZE
); 
 135     STDMETHODIMP 
OnUIDeactivate(BOOL
); 
 136     STDMETHODIMP 
OnInPlaceDeactivate(); 
 137     STDMETHODIMP 
DiscardUndoState(); 
 138     STDMETHODIMP 
DeactivateAndUndo(); 
 139     STDMETHODIMP 
OnPosRectChange(LPCRECT
); 
 142     STDMETHODIMP 
OnInPlaceActivateEx(BOOL
*, DWORD
); 
 143     STDMETHODIMP 
OnInPlaceDeactivateEx(BOOL
); 
 144     STDMETHODIMP 
RequestUIActivate(); 
 147     STDMETHODIMP 
SaveObject(); 
 148     STDMETHODIMP 
GetMoniker(DWORD
, DWORD
, IMoniker
**); 
 149     STDMETHODIMP 
GetContainer(LPOLECONTAINER FAR
*); 
 150     STDMETHODIMP 
ShowObject(); 
 151     STDMETHODIMP 
OnShowWindow(BOOL
); 
 152     STDMETHODIMP 
RequestNewObjectLayout(); 
 155     STDMETHODIMP 
OnControlInfoChanged(); 
 156     STDMETHODIMP 
LockInPlaceActive(BOOL
); 
 157     STDMETHODIMP 
GetExtendedControl(IDispatch
**); 
 158     STDMETHODIMP 
TransformCoords(POINTL
*, POINTF
*, DWORD
); 
 159     STDMETHODIMP 
TranslateAccelerator(LPMSG
, DWORD
); 
 160     STDMETHODIMP 
OnFocus(BOOL
); 
 161     STDMETHODIMP 
ShowPropertyFrame(); 
 164     STDMETHODIMP 
QueryStatus(const GUID
*, ULONG
, OLECMD
[], OLECMDTEXT
*); 
 165     STDMETHODIMP 
Exec(const GUID
*, DWORD
, DWORD
, VARIANTARG
*, VARIANTARG
*); 
 168     STDMETHODIMP 
ParseDisplayName(IBindCtx
*, LPOLESTR
, ULONG
*, IMoniker
**); 
 171     STDMETHODIMP 
EnumObjects(DWORD
, IEnumUnknown
**); 
 172     STDMETHODIMP 
LockContainer(BOOL
); 
 175     STDMETHODIMP 
GetObject(LPOLESTR
, DWORD
, IBindCtx
*, REFIID
, void**); 
 176     STDMETHODIMP 
GetObjectStorage(LPOLESTR
, IBindCtx
*, REFIID
, void**); 
 177     STDMETHODIMP 
IsRunning(LPOLESTR
); 
 180     STDMETHODIMP 
GetIDsOfNames(REFIID
, OLECHAR
**, unsigned int, LCID
, DISPID
*); 
 181     STDMETHODIMP 
GetTypeInfo(unsigned int, LCID
, ITypeInfo
**); 
 182     STDMETHODIMP 
GetTypeInfoCount(unsigned int*); 
 183     STDMETHODIMP 
Invoke(DISPID
, REFIID
, LCID
, WORD
, DISPPARAMS
*, VARIANT
*, EXCEPINFO
*, UINT
*); 
 186     void STDMETHODCALLTYPE 
OnDataChange(FORMATETC
*, STGMEDIUM
*); 
 187     void STDMETHODCALLTYPE 
OnViewChange(DWORD
, LONG
); 
 188     void STDMETHODCALLTYPE 
OnRename(IMoniker
*); 
 189     void STDMETHODCALLTYPE 
OnSave(); 
 190     void STDMETHODCALLTYPE 
OnClose(); 
 193     HRESULT STDMETHODCALLTYPE 
ActivateMe(IOleDocumentView __RPC_FAR 
*pViewToActivate
); 
 197     wxActiveX 
* m_window
; 
 202     bool m_bSupportsWindowlessActivation
; 
 203     bool m_bInPlaceLocked
; 
 204     bool m_bInPlaceActive
; 
 210     LCID m_nAmbientLocale
; 
 211     COLORREF m_clrAmbientForeColor
; 
 212     COLORREF m_clrAmbientBackColor
; 
 213     bool m_bAmbientShowHatching
; 
 214     bool m_bAmbientShowGrabHandles
; 
 215     bool m_bAmbientAppearance
; 
 218 DEFINE_OLE_TABLE(FrameSite
) 
 219     OLE_INTERFACE(IID_IUnknown
, IOleClientSite
) 
 221     OLE_IINTERFACE(IOleClientSite
) 
 223     OLE_INTERFACE(IID_IOleWindow
, IOleInPlaceSite
) 
 224     OLE_IINTERFACE(IOleInPlaceSite
) 
 225     OLE_IINTERFACE(IOleInPlaceSiteEx
) 
 227     //OLE_IINTERFACE(IOleWindow) 
 228     OLE_IINTERFACE(IOleInPlaceUIWindow
) 
 229     OLE_IINTERFACE(IOleInPlaceFrame
) 
 231     OLE_IINTERFACE(IParseDisplayName
) 
 232     OLE_IINTERFACE(IOleContainer
) 
 233     OLE_IINTERFACE(IOleItemContainer
) 
 235     OLE_IINTERFACE(IDispatch
) 
 237     OLE_IINTERFACE(IOleCommandTarget
) 
 239     OLE_IINTERFACE(IOleDocumentSite
) 
 241     OLE_IINTERFACE(IAdviseSink
) 
 243     OLE_IINTERFACE(IOleControlSite
) 
 248 wxActiveX::wxActiveX(wxWindow 
* parent
, REFCLSID clsid
, wxWindowID id
, 
 252         const wxString
& name
) : 
 253 wxWindow(parent
, id
, pos
, size
, style
, name
) 
 255     m_bAmbientUserMode 
= true; 
 256     m_docAdviseCookie 
= 0; 
 257     CreateActiveX(clsid
); 
 260 wxActiveX::wxActiveX(wxWindow 
* parent
, const wxString
& progId
, wxWindowID id
, 
 264         const wxString
& name
) : 
 265     wxWindow(parent
, id
, pos
, size
, style
, name
) 
 267     m_bAmbientUserMode 
= true; 
 268     m_docAdviseCookie 
= 0; 
 269     CreateActiveX((LPOLESTR
) (const wchar_t *) progId
.wc_str(wxConvUTF8
)); 
 272 wxActiveX::~wxActiveX() 
 274     // disconnect connection points 
 275     wxOleConnectionArray::iterator it 
= m_connections
.begin(); 
 276     while (it 
!= m_connections
.end()) 
 278         wxOleConnectionPoint
& cp 
= it
->first
; 
 279         cp
->Unadvise(it
->second
); 
 283     m_connections
.clear(); 
 285     if (m_oleInPlaceObject
.Ok())  
 287         m_oleInPlaceObject
->InPlaceDeactivate(); 
 288         m_oleInPlaceObject
->UIDeactivate(); 
 292     if (m_oleObject
.Ok())  
 294         if (m_docAdviseCookie 
!= 0) 
 295             m_oleObject
->Unadvise(m_docAdviseCookie
); 
 297         m_oleObject
->DoVerb(OLEIVERB_HIDE
, NULL
, m_clientSite
, 0, (HWND
) GetHWND(), NULL
); 
 298         m_oleObject
->Close(OLECLOSE_NOSAVE
); 
 299         m_oleObject
->SetClientSite(NULL
); 
 302     // Unregister object as active 
 303     RevokeActiveObject(m_pdwRegister
, NULL
); 
 306 void wxActiveX::CreateActiveX(REFCLSID clsid
) 
 312     //////////////////////////////////////////////////////// 
 314     FrameSite 
*frame 
= new FrameSite(this); 
 316     hret 
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch 
*) frame
); 
 317     wxCHECK_RET(SUCCEEDED(hret
), _T("m_clientSite.QueryInterface failed")); 
 319     wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch 
*) frame
); 
 320     wxCHECK_RET(adviseSink
.Ok(), _T("adviseSink not Ok")); 
 323     // Create Object, get IUnknown interface 
 324     m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
); 
 325     wxCHECK_RET(m_ActiveX
.Ok(), _T("m_ActiveX.CreateInstance failed")); 
 327     // Register object as active 
 328     unsigned long pdwRegister
; 
 329     hret 
= RegisterActiveObject(m_ActiveX
, clsid
, ACTIVEOBJECT_WEAK
, &m_pdwRegister
); 
 330     WXOLE_WARN(hret
, "Unable to register object as active"); 
 332     // Get Dispatch interface 
 333     hret 
= m_Dispatch
.QueryInterface(IID_IDispatch
, m_ActiveX
);  
 334     WXOLE_WARN(hret
, "Unable to get dispatch interface"); 
 339     // Get IOleObject interface 
 340     hret 
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);  
 341     wxCHECK_RET(SUCCEEDED(hret
), _("Unable to get IOleObject interface")); 
 343     // get IViewObject Interface 
 344     hret 
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
);  
 345     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IViewObject Interface")); 
 348     m_docAdviseCookie 
= 0; 
 349     hret 
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
); 
 350     WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")"); 
 351     m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
); 
 352     OleSetContainedObject(m_oleObject
, TRUE
); 
 356     // Get IOleInPlaceObject interface 
 357     hret 
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
); 
 358     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IOleInPlaceObject interface")); 
 362     m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
); 
 363     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get oleObject status")); 
 365     // set client site first ? 
 366     if (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
) 
 367         m_oleObject
->SetClientSite(m_clientSite
); 
 371     wxAutoOleInterface
<IPersistStreamInit
> 
 372         pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
); 
 374     if (pPersistStreamInit
.Ok()) 
 376         hret 
= pPersistStreamInit
->InitNew(); 
 377         WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()"); 
 380     if (! (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
)) 
 381         m_oleObject
->SetClientSite(m_clientSite
); 
 385     GetClientSize(&w
, &h
); 
 394     if (m_oleInPlaceObject
.Ok()) 
 396         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 397         WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 399             ::SetActiveWindow(m_oleObjectHWND
); 
 403     if (! (dwMiscStatus 
& OLEMISC_INVISIBLEATRUNTIME
)) 
 405         if (w 
> 0 && h 
> 0 && m_oleInPlaceObject
.Ok()) 
 406             m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
 408         hret 
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 409         hret 
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 412     if (! m_oleObjectHWND 
&& m_oleInPlaceObject
.Ok()) 
 414         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 415         WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 420         ::SetActiveWindow(m_oleObjectHWND
); 
 421         ::ShowWindow(m_oleObjectHWND
, SW_SHOW
); 
 423         // Update by GBR to resize older controls 
 425         szEvent
.m_size 
= wxSize(w
, h
) ; 
 426         GetEventHandler()->AddPendingEvent(szEvent
); 
 430 void wxActiveX::CreateActiveX(LPOLESTR progId
) 
 433     if (CLSIDFromProgID(progId
, &clsid
) != S_OK
) 
 436     CreateActiveX(clsid
); 
 439 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 440 // Case Insensitive Map of Event names to eventTypes 
 441 // created dynamically at run time in: 
 442 //      EVT_ACTIVEX(eventName, id, fn) 
 443 // we map the pointer to them so that: 
 444 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 445 // can return a const reference, which is neccessary for event tables 
 446 // probably should use a wxWindows hash table here, but I'm lazy ... 
 447 typedef map
<wxString
, wxEventType 
*, NS_wxActiveX::less_wxStringI
> ActiveXNamedEventMap
; 
 448 static ActiveXNamedEventMap sg_NamedEventMap
; 
 450 const wxEventType
& RegisterActiveXEvent(const wxChar 
*eventName
) 
 452     wxString ev 
= eventName
; 
 453     ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.find(ev
); 
 454     if (it 
== sg_NamedEventMap
.end()) 
 456         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 457         sg_NamedEventMap
[ev
] = et
; 
 462     return *(it
->second
); 
 466 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 467 // Map of Event DISPID's to eventTypes 
 468 // created dynamically at run time in: 
 469 //      EVT_ACTIVEX(eventName, id, fn) 
 470 // we map the pointer to them so that: 
 471 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 472 // can return a const reference, which is neccessary for event tables 
 474 typedef map
<DISPID
, wxEventType 
*> ActiveXDISPIDEventMap
; 
 475 static ActiveXDISPIDEventMap sg_dispIdEventMap
; 
 477 const wxEventType
& RegisterActiveXEvent(DISPID event
) 
 479     ActiveXDISPIDEventMap::iterator it 
= sg_dispIdEventMap
.find(event
); 
 480     if (it 
== sg_dispIdEventMap
.end()) 
 482         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 483         sg_dispIdEventMap
[event
] = et
; 
 488     return *(it
->second
); 
 491 // one off class for automatic freeing of activeX eventtypes 
 492 class ActiveXEventMapFlusher
 
 495     ~ActiveXEventMapFlusher() 
 498         ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.end(); 
 499         while (it 
!= sg_NamedEventMap
.end()) 
 504         sg_NamedEventMap
.clear(); 
 507         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.end(); 
 508         while (dit 
!= sg_dispIdEventMap
.end()) 
 513         sg_dispIdEventMap
.clear(); 
 517 static ActiveXEventMapFlusher s_dummyActiveXEventMapFlusher
; 
 520 ////////////////////////////////////////////////////// 
 521 VARTYPE 
wxTypeToVType(const wxVariant
& v
) 
 523     wxString type 
= v
.GetType(); 
 524     if (type 
== wxT("bool")) 
 526     else if (type 
== wxT("char")) 
 528     else if (type 
== wxT("datetime")) 
 530     else if (type 
== wxT("double")) 
 532     else if (type 
== wxT("list")) 
 534     else if (type 
== wxT("long")) 
 536     else if (type 
== wxT("string")) 
 538     else if (type 
== wxT("stringlist")) 
 540     else if (type 
== wxT("date")) 
 542     else if (type 
== wxT("time")) 
 544     else if (type 
== wxT("void*")) 
 545         return VT_VOID 
| VT_BYREF
; 
 550 bool wxDateTimeToDATE(wxDateTime dt
, DATE
& d
) 
 553     memset(&st
, 0, sizeof(st
)); 
 555     st
.wYear 
= dt
.GetYear(); 
 556     st
.wMonth 
= dt
.GetMonth() + 1; 
 557     st
.wDay 
= dt
.GetDay(); 
 558     st
.wHour 
= dt
.GetHour(); 
 559     st
.wMinute 
= dt
.GetMinute(); 
 560     st
.wSecond 
= dt
.GetSecond(); 
 561     st
.wMilliseconds 
= dt
.GetMillisecond(); 
 562     return SystemTimeToVariantTime(&st
, &d
) != FALSE
; 
 565 bool wxDateTimeToVariant(wxDateTime dt
, VARIANTARG
& va
) 
 567     return wxDateTimeToDATE(dt
, va
.date
); 
 570 bool DATEToWxDateTime(DATE date
, wxDateTime
& dt
) 
 573     if (! VariantTimeToSystemTime(date
, &st
)) 
 578         wxDateTime::Month(int(wxDateTime::Jan
) + st
.wMonth 
- 1),  
 580         st
.wHour
, st
.wMinute
, st
.wSecond
, st
.wMilliseconds
); 
 585 bool VariantToWxDateTime(VARIANTARG va
, wxDateTime
& dt
) 
 587     HRESULT hr 
= VariantChangeType(&va
, &va
, 0, VT_DATE
); 
 591     return DATEToWxDateTime(va
.date
, dt
); 
 594 bool MSWVariantToVariant(VARIANTARG
& va
, wxVariant
& vx
) 
 600         return false; // don't support arrays yet 
 613             return MSWVariantToVariant(*va
.pvarVal
, vx
); 
 617             VariantChangeType(&tmp
, &tmp
, 0, wxTypeToVType(vx
)); 
 618             bool rc 
= MSWVariantToVariant(tmp
, vx
); 
 627             vx 
= (char) *va
.pbVal
; 
 636             vx 
= (long) *va
.puiVal
; 
 638             vx 
= (long) va
.uiVal
; 
 648             vx 
= (long) *va
.pulVal
; 
 650             vx 
= (long) va
.ulVal
; 
 672             vx 
= (*va
.pboolVal 
? true : false); 
 674             vx 
= (va
.boolVal 
? true : false); 
 679         return false; // what the hell is a CY ? 
 686                 hr 
= VarR8FromDec(va
.pdecVal
, &d
); 
 688                 hr 
= VarR8FromDec(&va
.decVal
, &d
); 
 691             return SUCCEEDED(hr
); 
 699                 rc 
= DATEToWxDateTime(*va
.pdate
, dt
); 
 701                 rc 
= VariantToWxDateTime(va
, dt
); 
 708             vx 
= wxString(*va
.pbstrVal
); 
 710             vx 
= wxString(va
.bstrVal
); 
 713     case VT_UNKNOWN
: // should do a custom wxVariantData for this 
 715             vx 
= (void *) *va
.ppunkVal
; 
 717             vx 
= (void *) va
.punkVal
; 
 720     case VT_DISPATCH
: // should do a custom wxVariantData for this 
 722             vx 
= (void *) *va
.ppdispVal
; 
 724             vx 
= (void *) va
.pdispVal
; 
 733 bool VariantToMSWVariant(const wxVariant
& vx
, VARIANTARG
& va
) 
 739         return false; // don't support arrays yet 
 751             return VariantToMSWVariant(vx
, *va
.pvarVal
); 
 754             va
.vt 
= wxTypeToVType(vx
); 
 755             return VariantToMSWVariant(vx
, va
); 
 762             *va
.pbVal 
= (char) vx
; 
 771             *va
.puiVal 
= (long) vx
; 
 773             va
.uiVal 
= (long) vx
; 
 783             *va
.pulVal 
= (long) vx
; 
 785             va
.ulVal 
= (long) vx
; 
 792             *va
.pfltVal 
= (double) vx
; 
 794             va
.fltVal 
= (double) vx
; 
 800             *va
.pdblVal 
= (double) vx
; 
 802             va
.dblVal 
= (double) vx
; 
 807             *va
.pboolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 809             va
.boolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 813         return false; // what the hell is a CY ? 
 817             return SUCCEEDED(VarDecFromR8(vx
, va
.pdecVal
)); 
 819             return SUCCEEDED(VarDecFromR8(vx
, &va
.decVal
)); 
 823             return wxDateTimeToDATE(vx
, *va
.pdate
); 
 825             return wxDateTimeToVariant(vx
,va
); 
 829             *va
.pbstrVal 
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
)); 
 831             va
.bstrVal 
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
)); 
 834     case VT_UNKNOWN
: // should do a custom wxVariantData for this 
 836             *va
.ppunkVal 
= (IUnknown 
*) (void *) vx
; 
 838             va
.punkVal 
= (IUnknown 
*) (void *) vx
; 
 841     case VT_DISPATCH
: // should do a custom wxVariantData for this 
 843             *va
.ppdispVal 
= (IDispatch 
*) (void *) vx
; 
 845             va
.pdispVal 
= (IDispatch 
*) (void *) vx
; 
 853 IMPLEMENT_CLASS(wxActiveXEvent
, wxCommandEvent
) 
 855 class wxActiveXEvents 
: public IDispatch
 
 858     DECLARE_OLE_UNKNOWN(wxActiveXEvents
); 
 861     wxActiveX   
*m_activeX
; 
 865     friend bool wxActiveXEventsInterface(wxActiveXEvents 
*self
, REFIID iid
, void **_interface
, const char *&desc
); 
 868     wxActiveXEvents(wxActiveX 
*ax
) : m_activeX(ax
), m_haveCustomId(false) {} 
 869     wxActiveXEvents(wxActiveX 
*ax
, REFIID iid
) : m_activeX(ax
), m_haveCustomId(true), m_customId(iid
) {} 
 870     virtual ~wxActiveXEvents()  
 875     STDMETHODIMP 
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
) 
 880     STDMETHODIMP 
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
) 
 885     STDMETHODIMP 
GetTypeInfoCount(unsigned int* i
) 
 891     void DispatchEvent(wxActiveX::FuncX 
&func
, const wxEventType
& eventType
, DISPPARAMS 
* pDispParams
) 
 893         wxActiveXEvent  event
; 
 894         event
.SetId(m_activeX
->GetId()); 
 895         event
.SetEventType(eventType
); 
 896         event
.m_params
.NullList(); 
 897         event
.m_params
.SetName(func
.name
); 
 903             // sometimes the pDispParams does not match the param info for a activex control 
 904             int nArg 
= wxMin(func
.params
.size(), pDispParams
->cArgs
); 
 905             for (int i 
= nArg 
- 1; i 
>= 0; i
--) 
 907                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 908                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 912                 MSWVariantToVariant(va
, vx
); 
 913                 event
.m_params
.Append(vx
); 
 919             int nArg 
= wxMin(func
.params
.size(), pDispParams
->cArgs
); 
 920             m_activeX
->GetEventHandler()->ProcessEvent(event
); 
 921             for (int i 
= 0; i 
< nArg
; i
++) 
 923                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 924                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 928                     wxVariant
& vx 
= event
.m_params
[nArg 
- i 
- 1]; 
 930                     VariantToMSWVariant(vx
, va
); 
 935             m_activeX
->GetEventHandler()->AddPendingEvent(event
); 
 939     STDMETHODIMP 
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
 940                           WORD wFlags
, DISPPARAMS 
* pDispParams
, 
 941                           VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
 942                           unsigned int * puArgErr
) 
 944         if (wFlags 
& (DISPATCH_PROPERTYGET 
| DISPATCH_PROPERTYPUT 
| DISPATCH_PROPERTYPUTREF
)) 
 949         // find event for dispid  
 950         wxActiveX::MemberIdMap::iterator mit 
= m_activeX
->m_eventMemberIds
.find((MEMBERID
) dispIdMember
); 
 951         if (mit 
== m_activeX
->m_eventMemberIds
.end()) 
 955         int midx 
= mit
->second
; 
 956         if (midx 
< 0 || midx 
>= m_activeX
->GetEventCount()) 
 959         wxActiveX::FuncX 
&func 
= m_activeX
->m_events
[midx
]; 
 962         // try to find dispid event 
 963         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.find(dispIdMember
); 
 964         if (dit 
!= sg_dispIdEventMap
.end()) 
 967             DispatchEvent(func
, *(dit
->second
), pDispParams
); 
 972         ActiveXNamedEventMap::iterator nit 
= sg_NamedEventMap
.find(func
.name
); 
 973         if (nit 
== sg_NamedEventMap
.end()) 
 977         DispatchEvent(func
, *(nit
->second
), pDispParams
); 
 982 bool wxActiveXEventsInterface(wxActiveXEvents 
*self
, REFIID iid
, void **_interface
, const char *&desc
) 
 984     if (self
->m_haveCustomId 
&& IsEqualIID(iid
, self
->m_customId
)) 
 986         WXOLE_TRACE("Found Custom Dispatch Interface"); 
 987         *_interface 
= (IUnknown 
*) (IDispatch 
*) self
; 
 988         desc 
= "Custom Dispatch Interface"; 
 995 DEFINE_OLE_TABLE(wxActiveXEvents
) 
 996     OLE_IINTERFACE(IUnknown
) 
 997     OLE_INTERFACE(IID_IDispatch
, IDispatch
) 
 998     OLE_INTERFACE_CUSTOM(wxActiveXEventsInterface
) 
1001 wxString 
wxActiveXEvent::EventName() 
1003     return m_params
.GetName(); 
1006 int wxActiveXEvent::ParamCount() const 
1008     return m_params
.GetCount(); 
1011 wxString 
wxActiveXEvent::ParamType(int idx
) 
1013     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
1015     return m_params
[idx
].GetType(); 
1018 wxString 
wxActiveXEvent::ParamName(int idx
) 
1020     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
1022     return m_params
[idx
].GetName(); 
1025 static wxVariant nullVar
; 
1027 wxVariant
& wxActiveXEvent::operator[] (int idx
) 
1029     wxASSERT(idx 
>= 0 && idx 
< ParamCount()); 
1031     return m_params
[idx
]; 
1034 wxVariant
& wxActiveXEvent::operator[] (wxString name
) 
1036     for (int i 
= 0; i 
< m_params
.GetCount(); i
++) 
1038         if (name
.CmpNoCase(m_params
[i
].GetName()) == 0) 
1042     wxString err 
= _T("wxActiveXEvent::operator[] invalid name <") + name 
+ _T(">"); 
1043     err 
+= _T("\r\nValid Names = :\r\n"); 
1044     for (i 
= 0; i 
< m_params
.GetCount(); i
++) 
1046         err 
+= m_params
[i
].GetName(); 
1050     wxASSERT_MSG(false, err
); 
1055 void wxActiveX::GetTypeInfo() 
1058     We are currently only interested in the IDispatch interface  
1059     to the control. For dual interfaces (TypeKind = TKIND_INTERFACE) 
1060     we should drill down through the inheritance  
1061     (using TYPEATTR->cImplTypes) and GetRefTypeOfImplType(n) 
1062     and retrieve all the func names etc that way, then generate a C++  
1065     But we don't do this and probably never will, so if we have a DUAL  
1066     interface then we query for the IDispatch  
1067     via GetRefTypeOfImplType(-1). 
1072     // get type info via class info 
1073     wxAutoOleInterface
<IProvideClassInfo
> classInfo(IID_IProvideClassInfo
, m_ActiveX
); 
1074     if (! classInfo
.Ok()) 
1078     wxAutoOleInterface
<ITypeInfo
> typeInfo
; 
1079     hret 
= classInfo
->GetClassInfo(typeInfo
.GetRef()); 
1080     if (! typeInfo
.Ok()) 
1084     TYPEATTR 
*ta 
= NULL
; 
1085     hret 
= typeInfo
->GetTypeAttr(&ta
); 
1089     // this should be a TKIND_COCLASS 
1090     wxASSERT(ta
->typekind 
== TKIND_COCLASS
); 
1092     // iterate contained interfaces 
1093     for (int i 
= 0; i 
< ta
->cImplTypes
; i
++) 
1097         // get dispatch type info handle 
1098         hret 
= typeInfo
->GetRefTypeOfImplType(i
, &rt
); 
1099         if (! SUCCEEDED(hret
)) 
1102         // get dispatch type info interface 
1103         wxAutoOleInterface
<ITypeInfo
>  ti
; 
1104         hret 
= typeInfo
->GetRefTypeInfo(rt
, ti
.GetRef()); 
1108         // check if default event sink 
1109         bool defInterface 
= false; 
1110         bool defEventSink 
= false; 
1111         int impTypeFlags 
= 0; 
1112         typeInfo
->GetImplTypeFlags(i
, &impTypeFlags
); 
1114         if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULT
) 
1116             if (impTypeFlags 
& IMPLTYPEFLAG_FSOURCE
) 
1118                 WXOLE_TRACEOUT("Default Event Sink"); 
1119                 defEventSink 
= true; 
1120                 if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULTVTABLE
) 
1122                     WXOLE_TRACEOUT("*ERROR* - Default Event Sink is via vTable"); 
1123                     defEventSink 
= false; 
1128                 WXOLE_TRACEOUT("Default Interface"); 
1129                 defInterface 
= true; 
1135         GetTypeInfo(ti
, defInterface
, defEventSink
); 
1140     typeInfo
->ReleaseTypeAttr(ta
); 
1143 void ElemDescToParam(const ELEMDESC
& ed
, wxActiveX::ParamX
& param
) 
1145     param
.flags 
= ed
.idldesc
.wIDLFlags
; 
1146     param
.vt 
= ed
.tdesc
.vt
; 
1147     param
.isPtr 
= (param
.vt 
== VT_PTR
); 
1148     param
.isSafeArray 
= (param
.vt 
== VT_SAFEARRAY
); 
1149     if (param
.isPtr 
|| param
.isSafeArray
) 
1150         param
.vt 
= ed
.tdesc
.lptdesc
->vt
; 
1153 void wxActiveX::GetTypeInfo(ITypeInfo 
*ti
, bool defInterface
, bool defEventSink
) 
1155     // wxAutoOleInterface<> assumes a ref has already been added 
1157     wxAutoOleInterface
<ITypeInfo
> typeInfo(ti
); 
1160     TYPEATTR 
*ta 
= NULL
; 
1161     HRESULT hret 
= typeInfo
->GetTypeAttr(&ta
); 
1165     if (ta
->typekind 
== TKIND_DISPATCH
) 
1167         WXOLE_TRACEOUT("GUID = " << GetIIDName(ta
->guid
).c_str()); 
1171             wxActiveXEvents 
*disp 
= new wxActiveXEvents(this, ta
->guid
); 
1172             ConnectAdvise(ta
->guid
, disp
); 
1176         // Get Function Names 
1177         for (int i 
= 0; i 
< ta
->cFuncs
; i
++) 
1179             FUNCDESC FAR 
*fd 
= NULL
; 
1181             hret 
= typeInfo
->GetFuncDesc(i
, &fd
); 
1185             BSTR anames
[1] = {NULL
}; 
1188             hret 
= typeInfo
->GetNames(fd
->memid
, anames
, 1, &n
); 
1192                 wxString name 
= anames
[0]; 
1194                 WXOLE_TRACEOUT("Name " << i 
<< " = " << name
.c_str()); 
1195                 SysFreeString(anames
[0]); 
1197                 if (defInterface 
|| defEventSink
) 
1201                     func
.memid 
= fd
->memid
; 
1202                     func
.hasOut 
= false; 
1205                     unsigned int maxPNames 
= fd
->cParams 
+ 1; 
1206                     unsigned int nPNames 
= 0; 
1207                     BSTR 
*pnames 
= new BSTR
[maxPNames
]; 
1209                     hret 
= typeInfo
->GetNames(fd
->memid
, pnames
, maxPNames
, &nPNames
); 
1212                     if (fd
->cParams 
< int(nPNames
)) 
1215                         SysFreeString(pnames
[0]); 
1219                     ElemDescToParam(fd
->elemdescFunc
, func
.retType
); 
1220                     for (int p 
= 0; p 
< fd
->cParams
; p
++) 
1224                         ElemDescToParam(fd
->lprgelemdescParam
[p
], param
); 
1226                         param
.name 
= pnames
[pbase 
+ p
]; 
1227                         SysFreeString(pnames
[pbase 
+ p
]); 
1229                         param
.isOptional 
= (p 
> fd
->cParams 
- fd
->cParamsOpt
); 
1231                         func
.hasOut 
|= (param
.IsOut() || param
.isPtr
); 
1232                         func
.params
.push_back(param
); 
1238                         m_events
.push_back(func
); 
1239                         m_eventMemberIds
[fd
->memid
] = m_events
.size() - 1; 
1243                         if (fd
->invkind 
== INVOKE_FUNC
) 
1245                             m_methods
.push_back(func
); 
1246                             m_methodNames
[func
.name
] = m_methods
.size() - 1; 
1250                             NameMap::iterator it 
= m_propNames
.find(func
.name
); 
1252                             if (it 
== m_propNames
.end()) 
1254                                 m_props
.push_back(PropX()); 
1255                                 idx 
= m_props
.size() - 1; 
1256                                 m_propNames
[func
.name
] = idx
; 
1257                                 m_props
[idx
].name 
= func
.name
; 
1258                                 m_props
[idx
].memid 
= func
.memid
; 
1264                             if (fd
->invkind 
== INVOKE_PROPERTYGET
) 
1265                                 m_props
[idx
].type 
= func
.retType
; 
1266                             else if (func
.params
.size() > 0) 
1268                                 m_props
[idx
].arg 
= func
.params
[0]; 
1269                                 m_props
[idx
].putByRef 
= (fd
->invkind 
== INVOKE_PROPERTYPUTREF
); 
1276             typeInfo
->ReleaseFuncDesc(fd
); 
1280     typeInfo
->ReleaseTypeAttr(ta
); 
1283 /////////////////////////////////////////////// 
1284 // Type Info exposure 
1285 const wxActiveX::FuncX
& wxActiveX::GetEventDesc(int idx
) const 
1287     wxASSERT(idx 
>= 0 && idx 
< GetEventCount()); 
1289     return m_events
[idx
]; 
1292 const wxActiveX::PropX
& wxActiveX::GetPropDesc(int idx
) const 
1294     if (idx 
< 0 || idx 
>= GetPropCount()) 
1295         throw exception("Property index out of bounds"); 
1297     return m_props
[idx
]; 
1300 const wxActiveX::PropX
& wxActiveX::GetPropDesc(const wxString
& name
) const 
1302     NameMap::const_iterator it 
= m_propNames
.find(name
); 
1303     if (it 
== m_propNames
.end()) 
1306         s 
<< _T("property <") << name 
<< _T("> not found"); 
1307         throw exception(s
.mb_str()); 
1310     return GetPropDesc(it
->second
); 
1313 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(int idx
) const 
1315     if (idx 
< 0 || idx 
>= GetMethodCount()) 
1316         throw exception("Method index out of bounds"); 
1319     return m_methods
[idx
]; 
1323 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(const wxString
& name
) const 
1325     NameMap::const_iterator it 
= m_methodNames
.find(name
); 
1326     if (it 
== m_methodNames
.end()) 
1329         s 
<< _T("method <") << name 
<< _T("> not found"); 
1330         throw exception(s
.mb_str()); 
1333     return GetMethodDesc(it
->second
); 
1337 void wxActiveX::SetProp(MEMBERID name
, VARIANTARG
& value
) 
1339     DISPID pids
[1] = {DISPID_PROPERTYPUT
}; 
1340     DISPPARAMS params 
= {&value
, pids
, 1, 1}; 
1343     memset(&x
, 0, sizeof(x
)); 
1344     unsigned int argErr 
= 0; 
1346     HRESULT hr 
= m_Dispatch
->Invoke( 
1348         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYPUT
, 
1349         ¶ms
, NULL
, &x
, &argErr
); 
1351     WXOLE_WARN(hr
, "Invoke Prop(...)"); 
1354 void wxActiveX::SetProp(const wxString 
&name
, const wxVariant 
&value
) 
1356     const PropX
& prop 
= GetPropDesc(name
); 
1357     if (! prop
.CanSet()) 
1360         s 
<< _T("property <") << name 
<< _T("> is readonly"); 
1361         throw exception(s
.mb_str()); 
1364     VARIANT v 
= {prop
.arg
.vt
}; 
1365     VariantToMSWVariant(value
, v
); 
1366     SetProp(prop
.memid
, v
); 
1367     VariantClear(&v
); // this releases any BSTR's etc 
1370 VARIANT 
wxActiveX::GetPropAsVariant(MEMBERID name
) 
1375     DISPPARAMS params 
= {NULL
, NULL
, 0, 0}; 
1378     memset(&x
, 0, sizeof(x
)); 
1379     unsigned int argErr 
= 0; 
1381     HRESULT hr 
= m_Dispatch
->Invoke( 
1383         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYGET
, 
1384         ¶ms
, &v
, &x
, &argErr
); 
1386     WXOLE_WARN(hr
, "Invoke Prop(...)"); 
1391 VARIANT 
wxActiveX::GetPropAsVariant(const wxString
& name
) 
1393     const PropX
& prop 
= GetPropDesc(name
); 
1394     if (! prop
.CanGet()) 
1397         s 
<< _T("property <") << name 
<< _T("> is writeonly"); 
1398         throw exception(s
.mb_str()); 
1401     return GetPropAsVariant(prop
.memid
); 
1404 wxVariant 
wxActiveX::GetPropAsWxVariant(const wxString
& name
) 
1406     VARIANT v 
= GetPropAsVariant(name
); 
1407     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BSTR
); 
1408     if (! SUCCEEDED(hr
)) 
1409         throw exception("Unable to convert variant"); 
1412     MSWVariantToVariant(v
, wv
); 
1419 wxString 
wxActiveX::GetPropAsString(const wxString
& name
) 
1421     VARIANT v 
= GetPropAsVariant(name
); 
1422     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BSTR
); 
1423     if (! SUCCEEDED(hr
)) 
1424         throw exception("Unable to convert variant"); 
1426     wxString s 
= v
.bstrVal
; 
1432 char wxActiveX::GetPropAsChar(const wxString
& name
) 
1434     VARIANT v 
= GetPropAsVariant(name
); 
1435     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_I1
); 
1436     if (! SUCCEEDED(hr
)) 
1437         throw exception("Unable to convert variant"); 
1442 long wxActiveX::GetPropAsLong(const wxString
& name
) 
1444     VARIANT v 
= GetPropAsVariant(name
); 
1445     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_I4
); 
1446     if (! SUCCEEDED(hr
)) 
1447         throw exception("Unable to convert variant"); 
1452 bool wxActiveX::GetPropAsBool(const wxString
& name
) 
1454     VARIANT v 
= GetPropAsVariant(name
); 
1455     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BOOL
); 
1456     if (! SUCCEEDED(hr
)) 
1457         throw exception("Unable to convert variant"); 
1459     return v
.boolVal 
!= 0; 
1462 double wxActiveX::GetPropAsDouble(const wxString
& name
) 
1464     VARIANT v 
= GetPropAsVariant(name
); 
1465     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_R8
); 
1466     if (! SUCCEEDED(hr
)) 
1467         throw exception("Unable to convert variant"); 
1472 wxDateTime 
wxActiveX::GetPropAsDateTime(const wxString
& name
) 
1475     VARIANT v 
= GetPropAsVariant(name
); 
1477     if (! VariantToWxDateTime(v
, dt
)) 
1478         throw exception("Unable to convert variant to wxDateTime"); 
1483 void *wxActiveX::GetPropAsPointer(const wxString
& name
) 
1485     VARIANT v 
= GetPropAsVariant(name
); 
1486     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BYREF
); 
1487     if (! SUCCEEDED(hr
)) 
1488         throw exception("Unable to convert variant"); 
1496 VARIANT 
wxActiveX::CallMethod(MEMBERID name
, VARIANTARG args
[], int argc
) 
1498     DISPPARAMS pargs 
= {args
, NULL
, argc
, 0}; 
1500     VariantInit(&retVal
); 
1503     memset(&x
, 0, sizeof(x
)); 
1504     unsigned int argErr 
= 0; 
1506     HRESULT hr 
= m_Dispatch
->Invoke( 
1508         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_METHOD
, 
1509         &pargs
, &retVal
, &x
, &argErr
); 
1511     WXOLE_WARN(hr
, "Invoke Method(...)"); 
1515 VARIANT 
wxActiveX::CallMethod(const wxString
& name
, VARIANTARG args
[], int argc
) 
1517     const FuncX
& func 
= GetMethodDesc(name
); 
1519         argc 
= func
.params
.size(); 
1521     return CallMethod(func
.memid
, args
, argc
); 
1525 wxVariant 
wxActiveX::CallMethod(const wxString
& name
, wxVariant args
[], int nargs
) 
1527     const FuncX
& func 
= GetMethodDesc(name
); 
1532     VARIANTARG 
*vargs 
= NULL
; 
1534         nargs 
= func
.params
.size(); 
1537         vargs 
= new VARIANTARG
[nargs
]; 
1541         // init type of vargs 
1542         for (int i 
= 0; i 
< nargs
; i
++) 
1543             vargs
[nargs 
- i 
- 1].vt 
= func
.params
[i
].vt
; 
1546         for (i 
= 0; i 
< nargs
; i
++) 
1547             VariantToMSWVariant(args
[i
], vargs
[nargs 
- i 
- 1]); 
1550     VARIANT rv 
= CallMethod(func
.memid
, vargs
, nargs
); 
1552     // process any by ref params 
1555         for (int i 
= 0; i 
< nargs
; i
++) 
1557             VARIANTARG
& va 
= vargs
[nargs 
- i 
- 1]; 
1558             const wxActiveX::ParamX 
&px 
= func
.params
[i
]; 
1562                 wxVariant
& vx 
= args
[i
]; 
1564                 MSWVariantToVariant(va
, vx
); 
1571         for (int i 
= 0; i 
< nargs
; i
++) 
1572             VariantClear(&vargs
[i
]); 
1578     MSWVariantToVariant(rv
, ret
); 
1585 /////////////////////////////////////////////// 
1587 HRESULT 
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown 
*events
) 
1589     wxOleConnectionPoint    cp
; 
1590     DWORD                   adviseCookie 
= 0; 
1592     wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
); 
1593     if (! cpContainer
.Ok()) 
1596     HRESULT hret 
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef()); 
1597     if (! SUCCEEDED(hret
)) 
1600     hret 
= cp
->Advise(events
, &adviseCookie
); 
1602     if (SUCCEEDED(hret
)) 
1603         m_connections
.push_back(wxOleConnection(cp
, adviseCookie
)); 
1606         WXOLE_WARN(hret
, "ConnectAdvise"); 
1612 HRESULT 
wxActiveX::AmbientPropertyChanged(DISPID dispid
) 
1614     wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
); 
1616     if (oleControl
.Ok()) 
1617         return oleControl
->OnAmbientPropertyChange(dispid
); 
1622 #define HIMETRIC_PER_INCH   2540 
1623 #define MAP_PIX_TO_LOGHIM(x,ppli)   MulDiv(HIMETRIC_PER_INCH, (x), (ppli)) 
1625 static void PixelsToHimetric(SIZEL 
&sz
) 
1627     static int logX 
= 0; 
1628     static int logY 
= 0; 
1633         HDC dc 
= GetDC(NULL
); 
1634         logX 
= GetDeviceCaps(dc
, LOGPIXELSX
); 
1635         logY 
= GetDeviceCaps(dc
, LOGPIXELSY
); 
1636         ReleaseDC(NULL
, dc
); 
1639 #define HIMETRIC_INCH   2540 
1640 #define CONVERT(x, logpixels)   MulDiv(HIMETRIC_INCH, (x), (logpixels)) 
1642     sz
.cx 
= CONVERT(sz
.cx
, logX
); 
1643     sz
.cy 
= CONVERT(sz
.cy
, logY
); 
1646 #undef HIMETRIC_INCH 
1650 void wxActiveX::OnSize(wxSizeEvent
& event
) 
1653     GetClientSize(&w
, &h
); 
1661     if (w 
<= 0 && h 
<= 0) 
1664     // extents are in HIMETRIC units 
1665     if (m_oleObject
.Ok()) 
1668         PixelsToHimetric(sz
); 
1672         m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
); 
1673         if (sz2
.cx 
!=  sz
.cx 
|| sz
.cy 
!= sz2
.cy
) 
1674             m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
); 
1677     if (m_oleInPlaceObject
.Ok())  
1678         m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
1681 void wxActiveX::OnPaint(wxPaintEvent
& event
) 
1683     wxLogTrace(wxT(""),wxT("repainting activex win")); 
1694     // Draw only when control is windowless or deactivated 
1697         ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
); 
1699             RECTL 
*prcBounds 
= (RECTL 
*) &posRect
; 
1700             m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
,  
1701                 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0); 
1706         dc
.SetBrush(*wxRED_BRUSH
); 
1707         dc
.DrawRectangle(0, 0, w
, h
); 
1708         dc
.SetBrush(wxNullBrush
); 
1714 void wxActiveX::OnMouse(wxMouseEvent
& event
) 
1716     if (m_oleObjectHWND 
== NULL
)  
1718         wxLogTrace(wxT(""),wxT("no oleInPlaceObject"));  
1723     wxLogTrace(wxT(""),wxT("mouse event")); 
1727     LRESULT lResult 
= 0; 
1729     if (event
.m_metaDown
)  
1730         wParam 
|= MK_CONTROL
; 
1731     if (event
.m_shiftDown
)  
1733     if (event
.m_leftDown
)  
1734         wParam 
|= MK_LBUTTON
; 
1735     if (event
.m_middleDown
)  
1736         wParam 
|= MK_MBUTTON
; 
1737     if (event
.m_rightDown
)  
1738         wParam 
|= MK_RBUTTON
; 
1739     lParam 
= event
.m_x 
<< 16; 
1740     lParam 
|= event
.m_y
; 
1742     if (event
.LeftDown())  
1743         msg 
= WM_LBUTTONDOWN
; 
1744     else if (event
.LeftDClick())  
1745         msg 
= WM_LBUTTONDBLCLK
; 
1746     else if (event
.LeftUp())  
1748     else if (event
.MiddleDown())  
1749         msg 
= WM_MBUTTONDOWN
; 
1750     else if (event
.MiddleDClick())  
1751         msg 
= WM_MBUTTONDBLCLK
; 
1752     else if (event
.MiddleUp())  
1754     else if (event
.RightDown())  
1755         msg 
= WM_RBUTTONDOWN
; 
1756     else if (event
.RightDClick())  
1757         msg 
= WM_RBUTTONDBLCLK
; 
1758     else if (event
.RightUp())  
1760     else if (event
.Moving() || event
.Dragging())  
1766         wxLogTrace(wxT(""),wxT("no message")); 
1767         event
.Skip(); return;  
1770     if (!::SendMessage(m_oleObjectHWND
, msg
, wParam
, lParam
))  
1772         wxLogTrace(wxT(""),wxT("msg not delivered")); 
1777     wxLogTrace(wxT(""),wxT("msg sent")); 
1780 long wxActiveX::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
1782     if (m_oleObjectHWND 
== NULL
) 
1783         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1792     case WM_SYSDEADCHAR
: 
1795         PostMessage(m_oleObjectHWND
, nMsg
, wParam
, lParam
); 
1798         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1802 void wxActiveX::OnSetFocus(wxFocusEvent
& event
) 
1804     if (m_oleInPlaceActiveObject
.Ok())  
1805         m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
); 
1808 void wxActiveX::OnKillFocus(wxFocusEvent
& event
) 
1810     if (m_oleInPlaceActiveObject
.Ok())  
1811         m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
); 
1815 FrameSite::FrameSite(wxActiveX 
* win
) 
1818     m_bSupportsWindowlessActivation 
= true; 
1819     m_bInPlaceLocked 
= false; 
1820     m_bUIActive 
= false; 
1821     m_bInPlaceActive 
= false; 
1822     m_bWindowless 
= false; 
1824     m_nAmbientLocale 
= 0; 
1825     m_clrAmbientForeColor 
= ::GetSysColor(COLOR_WINDOWTEXT
); 
1826     m_clrAmbientBackColor 
= ::GetSysColor(COLOR_WINDOW
); 
1827     m_bAmbientShowHatching 
= true; 
1828     m_bAmbientShowGrabHandles 
= true; 
1829     m_bAmbientAppearance 
= true; 
1832     m_hWndParent 
= (HWND
)m_window
->GetHWND(); 
1835 FrameSite::~FrameSite() 
1842 HRESULT 
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR 
** rgszNames
, unsigned int cNames
, 
1843                                  LCID lcid
, DISPID 
* rgDispId
) 
1845     WXOLE_TRACE("IDispatch::GetIDsOfNames"); 
1849 HRESULT 
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo 
** ppTInfo
) 
1851     WXOLE_TRACE("IDispatch::GetTypeInfo"); 
1855 HRESULT 
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
) 
1857     WXOLE_TRACE("IDispatch::GetTypeInfoCount"); 
1861 HRESULT 
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
1862                           WORD wFlags
, DISPPARAMS 
* pDispParams
, 
1863                           VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
1864                           unsigned int * puArgErr
) 
1866     WXOLE_TRACE("IDispatch::Invoke"); 
1868     if (!(wFlags 
& DISPATCH_PROPERTYGET
)) 
1873     if (pVarResult 
== NULL
)  
1874         return E_INVALIDARG
; 
1876     //The most common case is boolean, use as an initial type 
1877     V_VT(pVarResult
) = VT_BOOL
; 
1879     switch (dispIdMember
) 
1881         case DISPID_AMBIENT_MESSAGEREFLECT
: 
1882             WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT"); 
1883             V_BOOL(pVarResult
)= FALSE
; 
1886         case DISPID_AMBIENT_DISPLAYASDEFAULT
: 
1887             WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT"); 
1888             V_BOOL(pVarResult
)= TRUE
; 
1891         case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
: 
1892             WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED"); 
1893             V_BOOL(pVarResult
) = TRUE
; 
1897         case DISPID_AMBIENT_SILENT
: 
1898             WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT"); 
1899             V_BOOL(pVarResult
)= TRUE
; 
1902         case DISPID_AMBIENT_APPEARANCE
: 
1903             pVarResult
->vt 
= VT_BOOL
; 
1904             pVarResult
->boolVal 
= m_bAmbientAppearance
; 
1907         case DISPID_AMBIENT_FORECOLOR
: 
1908             pVarResult
->vt 
= VT_I4
; 
1909             pVarResult
->lVal 
= (long) m_clrAmbientForeColor
; 
1912         case DISPID_AMBIENT_BACKCOLOR
: 
1913             pVarResult
->vt 
= VT_I4
; 
1914             pVarResult
->lVal 
= (long) m_clrAmbientBackColor
; 
1917         case DISPID_AMBIENT_LOCALEID
: 
1918             pVarResult
->vt 
= VT_I4
; 
1919             pVarResult
->lVal 
= (long) m_nAmbientLocale
; 
1922         case DISPID_AMBIENT_USERMODE
: 
1923             pVarResult
->vt 
= VT_BOOL
; 
1924             pVarResult
->boolVal 
= m_window
->m_bAmbientUserMode
; 
1927         case DISPID_AMBIENT_SHOWGRABHANDLES
: 
1928             pVarResult
->vt 
= VT_BOOL
; 
1929             pVarResult
->boolVal 
= m_bAmbientShowGrabHandles
; 
1932         case DISPID_AMBIENT_SHOWHATCHING
: 
1933             pVarResult
->vt 
= VT_BOOL
; 
1934             pVarResult
->boolVal 
= m_bAmbientShowHatching
; 
1938             return DISP_E_MEMBERNOTFOUND
; 
1946 HRESULT 
FrameSite::GetWindow(HWND 
* phwnd
) 
1948     WXOLE_TRACE("IOleWindow::GetWindow"); 
1950         return E_INVALIDARG
; 
1951     (*phwnd
) = m_hWndParent
; 
1955 HRESULT 
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
) 
1957     WXOLE_TRACE("IOleWindow::ContextSensitiveHelp"); 
1961 //IOleInPlaceUIWindow 
1963 HRESULT 
FrameSite::GetBorder(LPRECT lprectBorder
) 
1965     WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder"); 
1966     if (lprectBorder 
== NULL
)  
1967         return E_INVALIDARG
; 
1968     return INPLACE_E_NOTOOLSPACE
; 
1971 HRESULT 
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
1973     WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace"); 
1974     if (pborderwidths 
== NULL
)  
1975         return E_INVALIDARG
; 
1976     return INPLACE_E_NOTOOLSPACE
; 
1979 HRESULT 
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
1981     WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace"); 
1985 HRESULT 
FrameSite::SetActiveObject(IOleInPlaceActiveObject 
*pActiveObject
, LPCOLESTR pszObjName
) 
1987     WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject"); 
1990         pActiveObject
->AddRef(); 
1992     m_window
->m_oleInPlaceActiveObject 
= pActiveObject
; 
1998 HRESULT 
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
) 
2000     WXOLE_TRACE("IOleInPlaceFrame::InsertMenus"); 
2004 HRESULT 
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
) 
2006     WXOLE_TRACE("IOleInPlaceFrame::SetMenu"); 
2010 HRESULT 
FrameSite::RemoveMenus(HMENU hmenuShared
) 
2012     WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus"); 
2016 HRESULT 
FrameSite::SetStatusText(LPCOLESTR pszStatusText
) 
2018     WXOLE_TRACE("IOleInPlaceFrame::SetStatusText"); 
2019     //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText); 
2023 HRESULT 
FrameSite::EnableModeless(BOOL fEnable
) 
2025     WXOLE_TRACE("IOleInPlaceFrame::EnableModeless"); 
2029 HRESULT 
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
) 
2031     WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator"); 
2032     // TODO: send an event with this id 
2033     if (m_window
->m_oleInPlaceActiveObject
.Ok()) 
2034         m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
); 
2041 HRESULT 
FrameSite::CanInPlaceActivate() 
2043     WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate"); 
2047 HRESULT 
FrameSite::OnInPlaceActivate() 
2049     WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate"); 
2050     m_bInPlaceActive 
= true; 
2054 HRESULT 
FrameSite::OnUIActivate() 
2056     WXOLE_TRACE("IOleInPlaceSite::OnUIActivate"); 
2061 HRESULT 
FrameSite::GetWindowContext(IOleInPlaceFrame 
**ppFrame
, 
2062                                     IOleInPlaceUIWindow 
**ppDoc
, 
2064                                     LPRECT lprcClipRect
, 
2065                                     LPOLEINPLACEFRAMEINFO lpFrameInfo
) 
2067     WXOLE_TRACE("IOleInPlaceSite::GetWindowContext"); 
2068     if (ppFrame 
== NULL 
|| ppDoc 
== NULL 
|| lprcPosRect 
== NULL 
|| 
2069         lprcClipRect 
== NULL 
|| lpFrameInfo 
== NULL
) 
2071         if (ppFrame 
!= NULL
)  
2075         return E_INVALIDARG
; 
2078     HRESULT hr 
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
); 
2079     if (! SUCCEEDED(hr
)) 
2081         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !"); 
2082         return E_UNEXPECTED
; 
2085     hr 
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
); 
2086     if (! SUCCEEDED(hr
)) 
2088         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !"); 
2089         (*ppFrame
)->Release(); 
2091         return E_UNEXPECTED
; 
2095     m_window
->GetClientSize(&w
, &h
); 
2098         lprcPosRect
->left 
= lprcPosRect
->top 
= 0; 
2099         lprcPosRect
->right 
= w
; 
2100         lprcPosRect
->bottom 
= h
; 
2104         lprcClipRect
->left 
= lprcClipRect
->top 
= 0; 
2105         lprcClipRect
->right 
= w
; 
2106         lprcClipRect
->bottom 
= h
; 
2109     memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
)); 
2110     lpFrameInfo
->cb 
= sizeof(OLEINPLACEFRAMEINFO
); 
2111     lpFrameInfo
->hwndFrame 
= m_hWndParent
; 
2116 HRESULT 
FrameSite::Scroll(SIZE scrollExtent
) 
2118     WXOLE_TRACE("IOleInPlaceSite::Scroll"); 
2122 HRESULT 
FrameSite::OnUIDeactivate(BOOL fUndoable
) 
2124     WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate"); 
2125     m_bUIActive 
= false; 
2129 HRESULT 
FrameSite::OnInPlaceDeactivate() 
2131     WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate"); 
2132     m_bInPlaceActive 
= false; 
2136 HRESULT 
FrameSite::DiscardUndoState() 
2138     WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState"); 
2142 HRESULT 
FrameSite::DeactivateAndUndo() 
2144     WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo"); 
2148 HRESULT 
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
) 
2150     WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange"); 
2151     if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
) 
2152         m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
); 
2159 HRESULT 
FrameSite::OnInPlaceActivateEx(BOOL 
* pfNoRedraw
, DWORD dwFlags
) 
2161     WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx"); 
2162     OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
); 
2164         (*pfNoRedraw
) = FALSE
; 
2168 HRESULT 
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
) 
2170     WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx"); 
2171     OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
); 
2175 HRESULT 
FrameSite::RequestUIActivate() 
2177     WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate"); 
2184 HRESULT 
FrameSite::SaveObject() 
2186     WXOLE_TRACE("IOleClientSite::SaveObject"); 
2190 const char *OleGetMonikerToStr(DWORD dwAssign
) 
2194     case OLEGETMONIKER_ONLYIFTHERE  
: return "OLEGETMONIKER_ONLYIFTHERE"; 
2195     case OLEGETMONIKER_FORCEASSIGN  
: return "OLEGETMONIKER_FORCEASSIGN"; 
2196     case OLEGETMONIKER_UNASSIGN     
: return "OLEGETMONIKER_UNASSIGN"; 
2197     case OLEGETMONIKER_TEMPFORUSER  
: return "OLEGETMONIKER_TEMPFORUSER";     
2198     default                         : return "Bad Enum"; 
2202 const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker
) 
2204     switch(dwWhichMoniker
) 
2206     case OLEWHICHMK_CONTAINER   
: return "OLEWHICHMK_CONTAINER"; 
2207     case OLEWHICHMK_OBJREL      
: return "OLEWHICHMK_OBJREL"; 
2208     case OLEWHICHMK_OBJFULL     
: return "OLEWHICHMK_OBJFULL"; 
2209     default                     : return "Bad Enum"; 
2213 HRESULT 
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
, 
2216     WXOLE_TRACEOUT("IOleClientSite::GetMoniker(" << OleGetMonikerToStr(dwAssign
) << ", " << OleGetWhicMonikerStr(dwWhichMoniker
) << ")"); 
2223     HRESULT hr = CreateFileMoniker(L"e:\\dev\\wxie\\bug-zap.swf", ppmk); 
2232 HRESULT 
FrameSite::GetContainer(LPOLECONTAINER 
* ppContainer
) 
2234     WXOLE_TRACE("IOleClientSite::GetContainer"); 
2235     if (ppContainer 
== NULL
)  
2236         return E_INVALIDARG
; 
2238     HRESULT hr 
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
)); 
2239     wxASSERT(SUCCEEDED(hr
)); 
2244 HRESULT 
FrameSite::ShowObject() 
2246     WXOLE_TRACE("IOleClientSite::ShowObject"); 
2247     if (m_window
->m_oleObjectHWND
) 
2248         ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
); 
2252 HRESULT 
FrameSite::OnShowWindow(BOOL fShow
) 
2254     WXOLE_TRACE("IOleClientSite::OnShowWindow"); 
2258 HRESULT 
FrameSite::RequestNewObjectLayout() 
2260     WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout"); 
2264 // IParseDisplayName 
2266 HRESULT 
FrameSite::ParseDisplayName(IBindCtx 
*pbc
, LPOLESTR pszDisplayName
, 
2267                                     ULONG 
*pchEaten
, IMoniker 
**ppmkOut
) 
2269     WXOLE_TRACE("IParseDisplayName::ParseDisplayName"); 
2275 HRESULT 
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown 
**ppenum
) 
2277     WXOLE_TRACE("IOleContainer::EnumObjects"); 
2281 HRESULT 
FrameSite::LockContainer(BOOL fLock
) 
2283     WXOLE_TRACE("IOleContainer::LockContainer"); 
2290 HRESULT 
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
,  
2291                              IBindCtx 
* pbc
, REFIID riid
, void ** ppvObject
) 
2293     WXOLE_TRACE("IOleItemContainer::GetObject"); 
2294     if (pszItem 
== NULL
)  
2295         return E_INVALIDARG
; 
2296     if (ppvObject 
== NULL
)  
2297         return E_INVALIDARG
; 
2300     return MK_E_NOOBJECT
; 
2303 HRESULT 
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx 
* pbc
,  
2304                                     REFIID riid
, void ** ppvStorage
) 
2306     WXOLE_TRACE("IOleItemContainer::GetObjectStorage"); 
2307     if (pszItem 
== NULL
)  
2308         return E_INVALIDARG
; 
2309     if (ppvStorage 
== NULL
)  
2310         return E_INVALIDARG
; 
2313     return MK_E_NOOBJECT
; 
2316 HRESULT 
FrameSite::IsRunning(LPOLESTR pszItem
) 
2318     WXOLE_TRACE("IOleItemContainer::IsRunning"); 
2319     if (pszItem 
== NULL
)  
2320         return E_INVALIDARG
; 
2322     return MK_E_NOOBJECT
; 
2329 HRESULT 
FrameSite::OnControlInfoChanged() 
2331     WXOLE_TRACE("IOleControlSite::OnControlInfoChanged"); 
2335 HRESULT 
FrameSite::LockInPlaceActive(BOOL fLock
) 
2337     WXOLE_TRACE("IOleControlSite::LockInPlaceActive"); 
2338     m_bInPlaceLocked 
= (fLock
) ? true : false; 
2342 HRESULT 
FrameSite::GetExtendedControl(IDispatch 
** ppDisp
) 
2344     WXOLE_TRACE("IOleControlSite::GetExtendedControl"); 
2348 HRESULT 
FrameSite::TransformCoords(POINTL 
* pPtlHimetric
, POINTF 
* pPtfContainer
, DWORD dwFlags
) 
2350     WXOLE_TRACE("IOleControlSite::TransformCoords"); 
2353     if (pPtlHimetric 
== NULL
) 
2354         return E_INVALIDARG
; 
2356     if (pPtfContainer 
== NULL
) 
2357         return E_INVALIDARG
; 
2363 HRESULT 
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
) 
2365     WXOLE_TRACE("IOleControlSite::TranslateAccelerator"); 
2366     // TODO: send an event with this id 
2370 HRESULT 
FrameSite::OnFocus(BOOL fGotFocus
) 
2372     WXOLE_TRACE("IOleControlSite::OnFocus"); 
2376 HRESULT 
FrameSite::ShowPropertyFrame() 
2378     WXOLE_TRACE("IOleControlSite::ShowPropertyFrame"); 
2384 HRESULT 
FrameSite::QueryStatus(const GUID 
* pguidCmdGroup
, ULONG cCmds
,  
2385                                OLECMD 
* prgCmds
, OLECMDTEXT 
* pCmdTet
) 
2387     WXOLE_TRACE("IOleCommandTarget::QueryStatus"); 
2388     if (prgCmds 
== NULL
) return E_INVALIDARG
; 
2389     bool bCmdGroupFound 
= false; 
2391     for (ULONG nCmd 
= 0; nCmd 
< cCmds
; nCmd
++) 
2393         // unsupported by default 
2394         prgCmds
[nCmd
].cmdf 
= 0; 
2399     if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
2403 HRESULT 
FrameSite::Exec(const GUID 
* pguidCmdGroup
, DWORD nCmdID
,  
2404                         DWORD nCmdExecOpt
, VARIANTARG 
* pVaIn
,  
2405                         VARIANTARG 
* pVaOut
) 
2407     WXOLE_TRACE("IOleCommandTarget::Exec"); 
2408     bool bCmdGroupFound 
= false; 
2410     if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
2411     return OLECMDERR_E_NOTSUPPORTED
; 
2416 void STDMETHODCALLTYPE 
FrameSite::OnDataChange(FORMATETC 
* pFormatEtc
, STGMEDIUM 
* pgStgMed
) 
2418     WXOLE_TRACE("IAdviseSink::OnDataChange"); 
2421 void STDMETHODCALLTYPE 
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
) 
2423     WXOLE_TRACE("IAdviseSink::OnViewChange"); 
2424     // redraw the control 
2427 void STDMETHODCALLTYPE 
FrameSite::OnRename(IMoniker 
* pmk
) 
2429     WXOLE_TRACE("IAdviseSink::OnRename"); 
2432 void STDMETHODCALLTYPE 
FrameSite::OnSave() 
2434     WXOLE_TRACE("IAdviseSink::OnSave"); 
2437 void STDMETHODCALLTYPE 
FrameSite::OnClose() 
2439     WXOLE_TRACE("IAdviseSink::OnClose"); 
2442 ///////////////////////////////////////////// 
2444 HRESULT STDMETHODCALLTYPE 
FrameSite::ActivateMe( 
2445         /* [in] */ IOleDocumentView __RPC_FAR 
*pViewToActivate
) 
2447     wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch 
*) this); 
2448     if (!inPlaceSite
.Ok()) 
2451     if (pViewToActivate
) 
2453         m_window
->m_docView 
= pViewToActivate
; 
2454         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
2458         wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
); 
2462         HRESULT hr 
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef()); 
2466         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
2469     m_window
->m_docView
->UIActivate(TRUE
); 
2475 static IMalloc 
*iMalloc 
= NULL
; 
2477 IMalloc 
*wxOleInit::GetIMalloc() 
2483 wxOleInit::wxOleInit() 
2485     if (OleInitialize(NULL
) == S_OK 
&& iMalloc 
== NULL
) 
2486         CoGetMalloc(1, &iMalloc
); 
2491 wxOleInit::~wxOleInit() 
2495         if (iMalloc
->Release() == 0) 
2502 bool GetSysErrMessage(int err
, wxString
& s
) 
2506         FORMAT_MESSAGE_FROM_SYSTEM
, NULL
, 
2507         err
,0, buf
, sizeof(buf
), NULL
) == 0) 
2510     buf
[sizeof(buf
) - 1] = 0; 
2515 wxString 
OLEHResultToString(HRESULT hr
) 
2517     // try formatmessage 
2519     if (GetSysErrMessage(hr
, err
)) 
2525         return wxEmptyString
; 
2527     case CONNECT_E_CANNOTCONNECT
: 
2528         return _T("Cannot connect to event interface (maybe not there ?) - see MSDN"); 
2530     case DISP_E_MEMBERNOTFOUND
: 
2531         return _T("The requested member does not exist, or the call to Invoke tried to set the value of a read-only property."); 
2533     case DISP_E_BADVARTYPE
: 
2534         return _T("One of the parameters in rgvarg is not a valid variant type."); 
2536     case DISP_E_BADPARAMCOUNT
: 
2537         return _T("The number of elements provided to DISPPARAMS is different from the number of parameters accepted by the method or property"); 
2539     case DISP_E_EXCEPTION
: 
2540         return _T("The application needs to raise an exception. In this case, the structure passed in pExcepInfo should be filled in."); 
2542     case DISP_E_TYPEMISMATCH
: 
2543         return _T("One or more of the parameters could not be coerced. The index within rgvarg of the first parameter with the incorrect type is returned in the puArgErr parameter."); 
2545     case DISP_E_PARAMNOTOPTIONAL
: 
2546         return _T("A required parameter was omitted."); 
2548     case DISP_E_PARAMNOTFOUND
: 
2549         return _T("One of the parameter DISPIDs does not correspond to a parameter on the method. In this case, puArgErr should be set to the first parameter that contains the error."); 
2551     case OLECMDERR_E_UNKNOWNGROUP
: 
2552         return _T("The pguidCmdGroup parameter is not NULL but does not specify a recognized command group."); 
2554     case OLECMDERR_E_NOTSUPPORTED
: 
2555         return _T("The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup."); 
2557     case OLECMDERR_E_DISABLED
: 
2558         return _T("The command identified by nCmdID is currently disabled and cannot be executed."); 
2560     case OLECMDERR_E_NOHELP
: 
2561         return _T("The caller has asked for help on the command identified by nCmdID, but no help is available."); 
2563     case OLECMDERR_E_CANCELED
: 
2564         return _T("The user canceled the execution of the command."); 
2567         return _T("E_INVALIDARG"); 
2570         return _T("E_OUTOFMEMORY"); 
2573         return _T("E_NOINTERFACE"); 
2576         return _T("E_UNEXPECTED"); 
2578     case STG_E_INVALIDFLAG
: 
2579         return _T("STG_E_INVALIDFLAG"); 
2582         return _T("E_FAIL"); 
2585         return _T("E_NOTIMPL"); 
2590             buf
.Printf(_T("Unknown - 0x%X"), hr
); 
2596 // borrowed from src/msw/ole/oleutils.cpp 
2597 wxString 
GetIIDName(REFIID riid
) 
2599   // an association between symbolic name and numeric value of an IID 
2603     const wxChar 
*szName
; 
2606   // construct the table containing all known interfaces 
2607   #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) } 
2608   #define ADD_KNOWN_GUID(name) { &name, _T(#name) } 
2610   static const KNOWN_IID aKnownIids
[] =  
2612     ADD_KNOWN_IID(ServiceProvider
), 
2613     ADD_KNOWN_IID(AdviseSink
), 
2614     ADD_KNOWN_IID(AdviseSink2
), 
2615     ADD_KNOWN_IID(BindCtx
), 
2616     ADD_KNOWN_IID(ClassFactory
), 
2617 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__) 
2618     ADD_KNOWN_IID(ContinueCallback
), 
2619     ADD_KNOWN_IID(EnumOleDocumentViews
), 
2620     ADD_KNOWN_IID(OleCommandTarget
), 
2621     ADD_KNOWN_IID(OleDocument
), 
2622     ADD_KNOWN_IID(OleDocumentSite
), 
2623     ADD_KNOWN_IID(OleDocumentView
), 
2624     ADD_KNOWN_IID(Print
), 
2626     ADD_KNOWN_IID(DataAdviseHolder
), 
2627     ADD_KNOWN_IID(DataObject
), 
2628     ADD_KNOWN_IID(Debug
), 
2629     ADD_KNOWN_IID(DebugStream
), 
2630     ADD_KNOWN_IID(DfReserved1
), 
2631     ADD_KNOWN_IID(DfReserved2
), 
2632     ADD_KNOWN_IID(DfReserved3
), 
2633     ADD_KNOWN_IID(Dispatch
), 
2634     ADD_KNOWN_IID(DropSource
), 
2635     ADD_KNOWN_IID(DropTarget
), 
2636     ADD_KNOWN_IID(EnumCallback
), 
2637     ADD_KNOWN_IID(EnumFORMATETC
), 
2638     ADD_KNOWN_IID(EnumGeneric
), 
2639     ADD_KNOWN_IID(EnumHolder
), 
2640     ADD_KNOWN_IID(EnumMoniker
), 
2641     ADD_KNOWN_IID(EnumOLEVERB
), 
2642     ADD_KNOWN_IID(EnumSTATDATA
), 
2643     ADD_KNOWN_IID(EnumSTATSTG
), 
2644     ADD_KNOWN_IID(EnumString
), 
2645     ADD_KNOWN_IID(EnumUnknown
), 
2646     ADD_KNOWN_IID(EnumVARIANT
), 
2647     ADD_KNOWN_IID(ExternalConnection
), 
2648     ADD_KNOWN_IID(InternalMoniker
), 
2649     ADD_KNOWN_IID(LockBytes
), 
2650     ADD_KNOWN_IID(Malloc
), 
2651     ADD_KNOWN_IID(Marshal
), 
2652     ADD_KNOWN_IID(MessageFilter
), 
2653     ADD_KNOWN_IID(Moniker
), 
2654     ADD_KNOWN_IID(OleAdviseHolder
), 
2655     ADD_KNOWN_IID(OleCache
), 
2656     ADD_KNOWN_IID(OleCache2
), 
2657     ADD_KNOWN_IID(OleCacheControl
), 
2658     ADD_KNOWN_IID(OleClientSite
), 
2659     ADD_KNOWN_IID(OleContainer
), 
2660     ADD_KNOWN_IID(OleInPlaceActiveObject
), 
2661     ADD_KNOWN_IID(OleInPlaceFrame
), 
2662     ADD_KNOWN_IID(OleInPlaceObject
), 
2663     ADD_KNOWN_IID(OleInPlaceSite
), 
2664     ADD_KNOWN_IID(OleInPlaceUIWindow
), 
2665     ADD_KNOWN_IID(OleItemContainer
), 
2666     ADD_KNOWN_IID(OleLink
), 
2667     ADD_KNOWN_IID(OleManager
), 
2668     ADD_KNOWN_IID(OleObject
), 
2669     ADD_KNOWN_IID(OlePresObj
), 
2670     ADD_KNOWN_IID(OleWindow
), 
2671     ADD_KNOWN_IID(PSFactory
), 
2672     ADD_KNOWN_IID(ParseDisplayName
), 
2673     ADD_KNOWN_IID(Persist
), 
2674     ADD_KNOWN_IID(PersistFile
), 
2675     ADD_KNOWN_IID(PersistStorage
), 
2676     ADD_KNOWN_IID(PersistStream
), 
2677     ADD_KNOWN_IID(ProxyManager
), 
2678     ADD_KNOWN_IID(RootStorage
), 
2679     ADD_KNOWN_IID(RpcChannel
), 
2680     ADD_KNOWN_IID(RpcProxy
), 
2681     ADD_KNOWN_IID(RpcStub
), 
2682     ADD_KNOWN_IID(RunnableObject
), 
2683     ADD_KNOWN_IID(RunningObjectTable
), 
2684     ADD_KNOWN_IID(StdMarshalInfo
), 
2685     ADD_KNOWN_IID(Storage
), 
2686     ADD_KNOWN_IID(Stream
), 
2687     ADD_KNOWN_IID(StubManager
), 
2688     ADD_KNOWN_IID(Unknown
), 
2689     ADD_KNOWN_IID(ViewObject
), 
2690     ADD_KNOWN_IID(ViewObject2
), 
2691     ADD_KNOWN_GUID(IID_IDispatch
), 
2692     ADD_KNOWN_GUID(IID_IWebBrowser
), 
2693     ADD_KNOWN_GUID(IID_IWebBrowserApp
), 
2694     ADD_KNOWN_GUID(IID_IWebBrowser2
), 
2695     ADD_KNOWN_GUID(IID_IWebBrowser
), 
2696     ADD_KNOWN_GUID(DIID_DWebBrowserEvents2
), 
2697     ADD_KNOWN_GUID(DIID_DWebBrowserEvents
), 
2700   // don't clobber preprocessor name space 
2701   #undef ADD_KNOWN_IID 
2702   #undef ADD_KNOWN_GUID 
2704   // try to find the interface in the table 
2705   for ( size_t ui 
= 0; ui 
< WXSIZEOF(aKnownIids
); ui
++ )  
2707     if ( riid 
== *aKnownIids
[ui
].pIid 
)  
2709       return aKnownIids
[ui
].szName
; 
2713   // unknown IID, just transform to string 
2714   LPOLESTR str 
= NULL
; 
2715   StringFromIID(riid
, &str
); 
2723       return _T("StringFromIID() error");