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
) 
 310     //////////////////////////////////////////////////////// 
 312     FrameSite 
*frame 
= new FrameSite(this); 
 314     hret 
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch 
*) frame
); 
 315     wxCHECK_RET(SUCCEEDED(hret
), _T("m_clientSite.QueryInterface failed")); 
 317     wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch 
*) frame
); 
 318     wxCHECK_RET(adviseSink
.Ok(), _T("adviseSink not Ok")); 
 321     // Create Object, get IUnknown interface 
 322     m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
); 
 323     wxCHECK_RET(m_ActiveX
.Ok(), _T("m_ActiveX.CreateInstance failed")); 
 325     // Register object as active 
 326     unsigned long pdwRegister
; 
 327     hret 
= RegisterActiveObject(m_ActiveX
, clsid
, ACTIVEOBJECT_WEAK
, &m_pdwRegister
); 
 328     WXOLE_WARN(hret
, "Unable to register object as active"); 
 330     // Get Dispatch interface 
 331     hret 
= m_Dispatch
.QueryInterface(IID_IDispatch
, m_ActiveX
);  
 332     WXOLE_WARN(hret
, "Unable to get dispatch interface"); 
 337     // Get IOleObject interface 
 338     hret 
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);  
 339     wxCHECK_RET(SUCCEEDED(hret
), _("Unable to get IOleObject interface")); 
 341     // get IViewObject Interface 
 342     hret 
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
);  
 343     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IViewObject Interface")); 
 346     m_docAdviseCookie 
= 0; 
 347     hret 
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
); 
 348     WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")"); 
 349     m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
); 
 350     OleSetContainedObject(m_oleObject
, TRUE
); 
 354     // Get IOleInPlaceObject interface 
 355     hret 
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
); 
 356     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IOleInPlaceObject interface")); 
 360     m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
); 
 361     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get oleObject status")); 
 363     // set client site first ? 
 364     if (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
) 
 365         m_oleObject
->SetClientSite(m_clientSite
); 
 369     wxAutoOleInterface
<IPersistStreamInit
> 
 370         pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
); 
 372     if (pPersistStreamInit
.Ok()) 
 374         hret 
= pPersistStreamInit
->InitNew(); 
 375         WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()"); 
 378     if (! (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
)) 
 379         m_oleObject
->SetClientSite(m_clientSite
); 
 383     GetClientSize(&w
, &h
); 
 392     if (m_oleInPlaceObject
.Ok()) 
 394         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 395         WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 397             ::SetActiveWindow(m_oleObjectHWND
); 
 401     if (! (dwMiscStatus 
& OLEMISC_INVISIBLEATRUNTIME
)) 
 403         if (w 
> 0 && h 
> 0 && m_oleInPlaceObject
.Ok()) 
 404             m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
 406         hret 
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 407         hret 
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 410     if (! m_oleObjectHWND 
&& m_oleInPlaceObject
.Ok()) 
 412         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 413         WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 418         ::SetActiveWindow(m_oleObjectHWND
); 
 419         ::ShowWindow(m_oleObjectHWND
, SW_SHOW
); 
 421         // Update by GBR to resize older controls 
 423         szEvent
.m_size 
= wxSize(w
, h
) ; 
 424         GetEventHandler()->AddPendingEvent(szEvent
); 
 428 void wxActiveX::CreateActiveX(LPOLESTR progId
) 
 431     if (CLSIDFromProgID(progId
, &clsid
) != S_OK
) 
 434     CreateActiveX(clsid
); 
 437 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 438 // Case Insensitive Map of Event names to eventTypes 
 439 // created dynamically at run time in: 
 440 //      EVT_ACTIVEX(eventName, id, fn) 
 441 // we map the pointer to them so that: 
 442 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 443 // can return a const reference, which is neccessary for event tables 
 444 // probably should use a wxWindows hash table here, but I'm lazy ... 
 445 typedef map
<wxString
, wxEventType 
*, NS_wxActiveX::less_wxStringI
> ActiveXNamedEventMap
; 
 446 static ActiveXNamedEventMap sg_NamedEventMap
; 
 448 const wxEventType
& RegisterActiveXEvent(const wxChar 
*eventName
) 
 450     wxString ev 
= eventName
; 
 451     ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.find(ev
); 
 452     if (it 
== sg_NamedEventMap
.end()) 
 454         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 455         sg_NamedEventMap
[ev
] = et
; 
 460     return *(it
->second
); 
 464 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 465 // Map of Event DISPID's to eventTypes 
 466 // created dynamically at run time in: 
 467 //      EVT_ACTIVEX(eventName, id, fn) 
 468 // we map the pointer to them so that: 
 469 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 470 // can return a const reference, which is neccessary for event tables 
 472 typedef map
<DISPID
, wxEventType 
*> ActiveXDISPIDEventMap
; 
 473 static ActiveXDISPIDEventMap sg_dispIdEventMap
; 
 475 const wxEventType
& RegisterActiveXEvent(DISPID event
) 
 477     ActiveXDISPIDEventMap::iterator it 
= sg_dispIdEventMap
.find(event
); 
 478     if (it 
== sg_dispIdEventMap
.end()) 
 480         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 481         sg_dispIdEventMap
[event
] = et
; 
 486     return *(it
->second
); 
 489 // one off class for automatic freeing of activeX eventtypes 
 490 class ActiveXEventMapFlusher
 
 493     ~ActiveXEventMapFlusher() 
 496         ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.end(); 
 497         while (it 
!= sg_NamedEventMap
.end()) 
 502         sg_NamedEventMap
.clear(); 
 505         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.end(); 
 506         while (dit 
!= sg_dispIdEventMap
.end()) 
 511         sg_dispIdEventMap
.clear(); 
 515 static ActiveXEventMapFlusher s_dummyActiveXEventMapFlusher
; 
 518 ////////////////////////////////////////////////////// 
 519 VARTYPE 
wxTypeToVType(const wxVariant
& v
) 
 521     wxString type 
= v
.GetType(); 
 522     if (type 
== wxT("bool")) 
 524     else if (type 
== wxT("char")) 
 526     else if (type 
== wxT("datetime")) 
 528     else if (type 
== wxT("double")) 
 530     else if (type 
== wxT("list")) 
 532     else if (type 
== wxT("long")) 
 534     else if (type 
== wxT("string")) 
 536     else if (type 
== wxT("stringlist")) 
 538     else if (type 
== wxT("date")) 
 540     else if (type 
== wxT("time")) 
 542     else if (type 
== wxT("void*")) 
 543         return VT_VOID 
| VT_BYREF
; 
 548 bool wxDateTimeToDATE(wxDateTime dt
, DATE
& d
) 
 551     memset(&st
, 0, sizeof(st
)); 
 553     st
.wYear 
= dt
.GetYear(); 
 554     st
.wMonth 
= dt
.GetMonth() + 1; 
 555     st
.wDay 
= dt
.GetDay(); 
 556     st
.wHour 
= dt
.GetHour(); 
 557     st
.wMinute 
= dt
.GetMinute(); 
 558     st
.wSecond 
= dt
.GetSecond(); 
 559     st
.wMilliseconds 
= dt
.GetMillisecond(); 
 560     return SystemTimeToVariantTime(&st
, &d
) != FALSE
; 
 563 bool wxDateTimeToVariant(wxDateTime dt
, VARIANTARG
& va
) 
 565     return wxDateTimeToDATE(dt
, va
.date
); 
 568 bool DATEToWxDateTime(DATE date
, wxDateTime
& dt
) 
 571     if (! VariantTimeToSystemTime(date
, &st
)) 
 576         wxDateTime::Month(int(wxDateTime::Jan
) + st
.wMonth 
- 1),  
 578         st
.wHour
, st
.wMinute
, st
.wSecond
, st
.wMilliseconds
); 
 583 bool VariantToWxDateTime(VARIANTARG va
, wxDateTime
& dt
) 
 585     HRESULT hr 
= VariantChangeType(&va
, &va
, 0, VT_DATE
); 
 589     return DATEToWxDateTime(va
.date
, dt
); 
 592 bool MSWVariantToVariant(VARIANTARG
& va
, wxVariant
& vx
) 
 598         return false; // don't support arrays yet 
 611             return MSWVariantToVariant(*va
.pvarVal
, vx
); 
 615             VariantChangeType(&tmp
, &tmp
, 0, wxTypeToVType(vx
)); 
 616             bool rc 
= MSWVariantToVariant(tmp
, vx
); 
 625             vx 
= (wxChar
) *va
.pbVal
; 
 627             vx 
= (wxChar
) va
.bVal
; 
 634             vx 
= (long) *va
.puiVal
; 
 636             vx 
= (long) va
.uiVal
; 
 646             vx 
= (long) *va
.pulVal
; 
 648             vx 
= (long) va
.ulVal
; 
 670             vx 
= (*va
.pboolVal 
? true : false); 
 672             vx 
= (va
.boolVal 
? true : false); 
 677         return false; // what the hell is a CY ? 
 684                 hr 
= VarR8FromDec(va
.pdecVal
, &d
); 
 686                 hr 
= VarR8FromDec(&va
.decVal
, &d
); 
 689             return SUCCEEDED(hr
); 
 697                 rc 
= DATEToWxDateTime(*va
.pdate
, dt
); 
 699                 rc 
= VariantToWxDateTime(va
, dt
); 
 706             vx 
= wxString(*va
.pbstrVal
); 
 708             vx 
= wxString(va
.bstrVal
); 
 711     case VT_UNKNOWN
: // should do a custom wxVariantData for this 
 713             vx 
= (void *) *va
.ppunkVal
; 
 715             vx 
= (void *) va
.punkVal
; 
 718     case VT_DISPATCH
: // should do a custom wxVariantData for this 
 720             vx 
= (void *) *va
.ppdispVal
; 
 722             vx 
= (void *) va
.pdispVal
; 
 731 bool VariantToMSWVariant(const wxVariant
& vx
, VARIANTARG
& va
) 
 737         return false; // don't support arrays yet 
 749             return VariantToMSWVariant(vx
, *va
.pvarVal
); 
 752             va
.vt 
= wxTypeToVType(vx
); 
 753             return VariantToMSWVariant(vx
, va
); 
 760             *va
.pbVal 
= (wxChar
) vx
; 
 762             va
.bVal 
= (wxChar
) vx
; 
 769             *va
.puiVal 
= (long) vx
; 
 771             va
.uiVal 
= (long) vx
; 
 781             *va
.pulVal 
= (long) vx
; 
 783             va
.ulVal 
= (long) vx
; 
 790             *va
.pfltVal 
= (double) vx
; 
 792             va
.fltVal 
= (double) vx
; 
 798             *va
.pdblVal 
= (double) vx
; 
 800             va
.dblVal 
= (double) vx
; 
 805             *va
.pboolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 807             va
.boolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 811         return false; // what the hell is a CY ? 
 815             return SUCCEEDED(VarDecFromR8(vx
, va
.pdecVal
)); 
 817             return SUCCEEDED(VarDecFromR8(vx
, &va
.decVal
)); 
 821             return wxDateTimeToDATE(vx
, *va
.pdate
); 
 823             return wxDateTimeToVariant(vx
,va
); 
 827             *va
.pbstrVal 
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
)); 
 829             va
.bstrVal 
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
)); 
 832     case VT_UNKNOWN
: // should do a custom wxVariantData for this 
 834             *va
.ppunkVal 
= (IUnknown 
*) (void *) vx
; 
 836             va
.punkVal 
= (IUnknown 
*) (void *) vx
; 
 839     case VT_DISPATCH
: // should do a custom wxVariantData for this 
 841             *va
.ppdispVal 
= (IDispatch 
*) (void *) vx
; 
 843             va
.pdispVal 
= (IDispatch 
*) (void *) vx
; 
 851 IMPLEMENT_CLASS(wxActiveXEvent
, wxCommandEvent
) 
 853 class wxActiveXEvents 
: public IDispatch
 
 856     DECLARE_OLE_UNKNOWN(wxActiveXEvents
); 
 859     wxActiveX   
*m_activeX
; 
 863     friend bool wxActiveXEventsInterface(wxActiveXEvents 
*self
, REFIID iid
, void **_interface
, const char *&desc
); 
 866     wxActiveXEvents(wxActiveX 
*ax
) : m_activeX(ax
), m_haveCustomId(false) {} 
 867     wxActiveXEvents(wxActiveX 
*ax
, REFIID iid
) : m_activeX(ax
), m_haveCustomId(true), m_customId(iid
) {} 
 868     virtual ~wxActiveXEvents()  
 873     STDMETHODIMP 
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
) 
 878     STDMETHODIMP 
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
) 
 883     STDMETHODIMP 
GetTypeInfoCount(unsigned int* i
) 
 889     void DispatchEvent(wxActiveX::FuncX 
&func
, const wxEventType
& eventType
, DISPPARAMS 
* pDispParams
) 
 891         wxActiveXEvent  event
; 
 892         event
.SetId(m_activeX
->GetId()); 
 893         event
.SetEventType(eventType
); 
 894         event
.m_params
.NullList(); 
 895         event
.m_params
.SetName(func
.name
); 
 901             // sometimes the pDispParams does not match the param info for a activex control 
 902             int nArg 
= wxMin(func
.params
.size(), pDispParams
->cArgs
); 
 903             for (int i 
= nArg 
- 1; i 
>= 0; i
--) 
 905                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 906                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 910                 MSWVariantToVariant(va
, vx
); 
 911                 event
.m_params
.Append(vx
); 
 917             int nArg 
= wxMin(func
.params
.size(), pDispParams
->cArgs
); 
 918             m_activeX
->GetEventHandler()->ProcessEvent(event
); 
 919             for (int i 
= 0; i 
< nArg
; i
++) 
 921                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 922                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 926                     wxVariant
& vx 
= event
.m_params
[nArg 
- i 
- 1]; 
 928                     VariantToMSWVariant(vx
, va
); 
 933             m_activeX
->GetEventHandler()->AddPendingEvent(event
); 
 937     STDMETHODIMP 
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
 938                           WORD wFlags
, DISPPARAMS 
* pDispParams
, 
 939                           VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
 940                           unsigned int * puArgErr
) 
 942         if (wFlags 
& (DISPATCH_PROPERTYGET 
| DISPATCH_PROPERTYPUT 
| DISPATCH_PROPERTYPUTREF
)) 
 947         // find event for dispid  
 948         wxActiveX::MemberIdMap::iterator mit 
= m_activeX
->m_eventMemberIds
.find((MEMBERID
) dispIdMember
); 
 949         if (mit 
== m_activeX
->m_eventMemberIds
.end()) 
 953         int midx 
= mit
->second
; 
 954         if (midx 
< 0 || midx 
>= m_activeX
->GetEventCount()) 
 957         wxActiveX::FuncX 
&func 
= m_activeX
->m_events
[midx
]; 
 960         // try to find dispid event 
 961         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.find(dispIdMember
); 
 962         if (dit 
!= sg_dispIdEventMap
.end()) 
 965             DispatchEvent(func
, *(dit
->second
), pDispParams
); 
 970         ActiveXNamedEventMap::iterator nit 
= sg_NamedEventMap
.find(func
.name
); 
 971         if (nit 
== sg_NamedEventMap
.end()) 
 975         DispatchEvent(func
, *(nit
->second
), pDispParams
); 
 980 bool wxActiveXEventsInterface(wxActiveXEvents 
*self
, REFIID iid
, void **_interface
, const char *&desc
) 
 982     if (self
->m_haveCustomId 
&& IsEqualIID(iid
, self
->m_customId
)) 
 984         WXOLE_TRACE("Found Custom Dispatch Interface"); 
 985         *_interface 
= (IUnknown 
*) (IDispatch 
*) self
; 
 986         desc 
= "Custom Dispatch Interface"; 
 993 DEFINE_OLE_TABLE(wxActiveXEvents
) 
 994     OLE_IINTERFACE(IUnknown
) 
 995     OLE_INTERFACE(IID_IDispatch
, IDispatch
) 
 996     OLE_INTERFACE_CUSTOM(wxActiveXEventsInterface
) 
 999 wxString 
wxActiveXEvent::EventName() 
1001     return m_params
.GetName(); 
1004 int wxActiveXEvent::ParamCount() const 
1006     return m_params
.GetCount(); 
1009 wxString 
wxActiveXEvent::ParamType(int idx
) 
1011     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
1013     return m_params
[idx
].GetType(); 
1016 wxString 
wxActiveXEvent::ParamName(int idx
) 
1018     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
1020     return m_params
[idx
].GetName(); 
1023 static wxVariant nullVar
; 
1025 wxVariant
& wxActiveXEvent::operator[] (int idx
) 
1027     wxASSERT(idx 
>= 0 && idx 
< ParamCount()); 
1029     return m_params
[idx
]; 
1032 wxVariant
& wxActiveXEvent::operator[] (wxString name
) 
1034     for (int i 
= 0; i 
< m_params
.GetCount(); i
++) 
1036         if (name
.CmpNoCase(m_params
[i
].GetName()) == 0) 
1040     wxString err 
= _T("wxActiveXEvent::operator[] invalid name <") + name 
+ _T(">"); 
1041     err 
+= _T("\r\nValid Names = :\r\n"); 
1042     for (i 
= 0; i 
< m_params
.GetCount(); i
++) 
1044         err 
+= m_params
[i
].GetName(); 
1048     wxASSERT_MSG(false, err
); 
1053 void wxActiveX::GetTypeInfo() 
1056     We are currently only interested in the IDispatch interface  
1057     to the control. For dual interfaces (TypeKind = TKIND_INTERFACE) 
1058     we should drill down through the inheritance  
1059     (using TYPEATTR->cImplTypes) and GetRefTypeOfImplType(n) 
1060     and retrieve all the func names etc that way, then generate a C++  
1063     But we don't do this and probably never will, so if we have a DUAL  
1064     interface then we query for the IDispatch  
1065     via GetRefTypeOfImplType(-1). 
1070     // get type info via class info 
1071     wxAutoOleInterface
<IProvideClassInfo
> classInfo(IID_IProvideClassInfo
, m_ActiveX
); 
1072     if (! classInfo
.Ok()) 
1076     wxAutoOleInterface
<ITypeInfo
> typeInfo
; 
1077     hret 
= classInfo
->GetClassInfo(typeInfo
.GetRef()); 
1078     if (! typeInfo
.Ok()) 
1082     TYPEATTR 
*ta 
= NULL
; 
1083     hret 
= typeInfo
->GetTypeAttr(&ta
); 
1087     // this should be a TKIND_COCLASS 
1088     wxASSERT(ta
->typekind 
== TKIND_COCLASS
); 
1090     // iterate contained interfaces 
1091     for (int i 
= 0; i 
< ta
->cImplTypes
; i
++) 
1095         // get dispatch type info handle 
1096         hret 
= typeInfo
->GetRefTypeOfImplType(i
, &rt
); 
1097         if (! SUCCEEDED(hret
)) 
1100         // get dispatch type info interface 
1101         wxAutoOleInterface
<ITypeInfo
>  ti
; 
1102         hret 
= typeInfo
->GetRefTypeInfo(rt
, ti
.GetRef()); 
1106         // check if default event sink 
1107         bool defInterface 
= false; 
1108         bool defEventSink 
= false; 
1109         int impTypeFlags 
= 0; 
1110         typeInfo
->GetImplTypeFlags(i
, &impTypeFlags
); 
1112         if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULT
) 
1114             if (impTypeFlags 
& IMPLTYPEFLAG_FSOURCE
) 
1116                 WXOLE_TRACEOUT("Default Event Sink"); 
1117                 defEventSink 
= true; 
1118                 if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULTVTABLE
) 
1120                     WXOLE_TRACEOUT("*ERROR* - Default Event Sink is via vTable"); 
1121                     defEventSink 
= false; 
1126                 WXOLE_TRACEOUT("Default Interface"); 
1127                 defInterface 
= true; 
1133         GetTypeInfo(ti
, defInterface
, defEventSink
); 
1138     typeInfo
->ReleaseTypeAttr(ta
); 
1141 void ElemDescToParam(const ELEMDESC
& ed
, wxActiveX::ParamX
& param
) 
1143     param
.flags 
= ed
.idldesc
.wIDLFlags
; 
1144     param
.vt 
= ed
.tdesc
.vt
; 
1145     param
.isPtr 
= (param
.vt 
== VT_PTR
); 
1146     param
.isSafeArray 
= (param
.vt 
== VT_SAFEARRAY
); 
1147     if (param
.isPtr 
|| param
.isSafeArray
) 
1148         param
.vt 
= ed
.tdesc
.lptdesc
->vt
; 
1151 void wxActiveX::GetTypeInfo(ITypeInfo 
*ti
, bool defInterface
, bool defEventSink
) 
1153     // wxAutoOleInterface<> assumes a ref has already been added 
1155     wxAutoOleInterface
<ITypeInfo
> typeInfo(ti
); 
1158     TYPEATTR 
*ta 
= NULL
; 
1159     HRESULT hret 
= typeInfo
->GetTypeAttr(&ta
); 
1163     if (ta
->typekind 
== TKIND_DISPATCH
) 
1165         WXOLE_TRACEOUT("GUID = " << GetIIDName(ta
->guid
).c_str()); 
1169             wxActiveXEvents 
*disp 
= new wxActiveXEvents(this, ta
->guid
); 
1170             ConnectAdvise(ta
->guid
, disp
); 
1174         // See bug #1280715 in the wxActiveX SF project 
1176         for (i 
= 0; i 
< ta
->cVars
; i
++) { 
1177             VARDESC FAR 
*vd 
= NULL
; 
1179             typeInfo
->GetVarDesc(i
, &vd
) ; 
1180             BSTR bstrProperty 
= NULL
; 
1181             typeInfo
->GetDocumentation(vd
->memid
, &bstrProperty
, 
1183             wxString 
propName(bstrProperty
); 
1184             m_props
.push_back(PropX()); 
1185             int idx 
= m_props
.size() - 1; 
1186             m_propNames
[propName
] = idx
; 
1187             m_props
[idx
].name 
= propName
; 
1188             m_props
[idx
].memid 
= vd
->memid
; 
1191             param
.isSafeArray 
= false; 
1192             param
.isPtr 
= false; 
1193             param
.flags 
= vd
->elemdescVar
.idldesc
.wIDLFlags
; 
1194             param
.vt 
= vd
->elemdescVar
.tdesc
.vt
; 
1196             m_props
[idx
].arg 
= param
; 
1197             m_props
[idx
].type 
= param
; 
1200         // Get Function Names 
1201         for (i 
= 0; i 
< ta
->cFuncs
; i
++) 
1203             FUNCDESC FAR 
*fd 
= NULL
; 
1205             hret 
= typeInfo
->GetFuncDesc(i
, &fd
); 
1209             BSTR anames
[1] = {NULL
}; 
1212             hret 
= typeInfo
->GetNames(fd
->memid
, anames
, 1, &n
); 
1216                 wxString name 
= anames
[0]; 
1218                 WXOLE_TRACEOUT("Name " << i 
<< " = " << name
.c_str()); 
1219                 SysFreeString(anames
[0]); 
1221                 if (defInterface 
|| defEventSink
) 
1225                     func
.memid 
= fd
->memid
; 
1226                     func
.hasOut 
= false; 
1229                     unsigned int maxPNames 
= fd
->cParams 
+ 1; 
1230                     unsigned int nPNames 
= 0; 
1231                     BSTR 
*pnames 
= new BSTR
[maxPNames
]; 
1233                     hret 
= typeInfo
->GetNames(fd
->memid
, pnames
, maxPNames
, &nPNames
); 
1236                     if (fd
->cParams 
< int(nPNames
)) 
1239                         SysFreeString(pnames
[0]); 
1243                     ElemDescToParam(fd
->elemdescFunc
, func
.retType
); 
1244                     for (int p 
= 0; p 
< fd
->cParams
; p
++) 
1248                         ElemDescToParam(fd
->lprgelemdescParam
[p
], param
); 
1250                         param
.name 
= pnames
[pbase 
+ p
]; 
1251                         SysFreeString(pnames
[pbase 
+ p
]); 
1253                         param
.isOptional 
= (p 
> fd
->cParams 
- fd
->cParamsOpt
); 
1255                         func
.hasOut 
|= (param
.IsOut() || param
.isPtr
); 
1256                         func
.params
.push_back(param
); 
1262                         m_events
.push_back(func
); 
1263                         m_eventMemberIds
[fd
->memid
] = m_events
.size() - 1; 
1267                         if (fd
->invkind 
== INVOKE_FUNC
) 
1269                             m_methods
.push_back(func
); 
1270                             m_methodNames
[func
.name
] = m_methods
.size() - 1; 
1274                             NameMap::iterator it 
= m_propNames
.find(func
.name
); 
1276                             if (it 
== m_propNames
.end()) 
1278                                 m_props
.push_back(PropX()); 
1279                                 idx 
= m_props
.size() - 1; 
1280                                 m_propNames
[func
.name
] = idx
; 
1281                                 m_props
[idx
].name 
= func
.name
; 
1282                                 m_props
[idx
].memid 
= func
.memid
; 
1288                             if (fd
->invkind 
== INVOKE_PROPERTYGET
) 
1289                                 m_props
[idx
].type 
= func
.retType
; 
1290                             else if (func
.params
.size() > 0) 
1292                                 m_props
[idx
].arg 
= func
.params
[0]; 
1293                                 m_props
[idx
].putByRef 
= (fd
->invkind 
== INVOKE_PROPERTYPUTREF
); 
1300             typeInfo
->ReleaseFuncDesc(fd
); 
1304     typeInfo
->ReleaseTypeAttr(ta
); 
1307 /////////////////////////////////////////////// 
1308 // Type Info exposure 
1309 const wxActiveX::FuncX
& wxActiveX::GetEventDesc(int idx
) const 
1311     wxASSERT(idx 
>= 0 && idx 
< GetEventCount()); 
1313     return m_events
[idx
]; 
1316 const wxActiveX::PropX
& wxActiveX::GetPropDesc(int idx
) const 
1318     if (idx 
< 0 || idx 
>= GetPropCount()) 
1319         throw exception("Property index out of bounds"); 
1321     return m_props
[idx
]; 
1324 const wxActiveX::PropX
& wxActiveX::GetPropDesc(const wxString
& name
) const 
1326     NameMap::const_iterator it 
= m_propNames
.find(name
); 
1327     if (it 
== m_propNames
.end()) 
1330         s 
<< _T("property <") << name 
<< _T("> not found"); 
1331         throw exception(s
.mb_str()); 
1334     return GetPropDesc(it
->second
); 
1337 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(int idx
) const 
1339     if (idx 
< 0 || idx 
>= GetMethodCount()) 
1340         throw exception("Method index out of bounds"); 
1343     return m_methods
[idx
]; 
1347 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(const wxString
& name
) const 
1349     NameMap::const_iterator it 
= m_methodNames
.find(name
); 
1350     if (it 
== m_methodNames
.end()) 
1353         s 
<< _T("method <") << name 
<< _T("> not found"); 
1354         throw exception(s
.mb_str()); 
1357     return GetMethodDesc(it
->second
); 
1361 void wxActiveX::SetProp(MEMBERID name
, VARIANTARG
& value
) 
1363     DISPID pids
[1] = {DISPID_PROPERTYPUT
}; 
1364     DISPPARAMS params 
= {&value
, pids
, 1, 1}; 
1367     memset(&x
, 0, sizeof(x
)); 
1368     unsigned int argErr 
= 0; 
1370     HRESULT hr 
= m_Dispatch
->Invoke( 
1372         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYPUT
, 
1373         ¶ms
, NULL
, &x
, &argErr
); 
1375     WXOLE_WARN(hr
, "Invoke Prop(...)"); 
1378 void wxActiveX::SetProp(const wxString 
&name
, const wxVariant 
&value
) 
1380     const PropX
& prop 
= GetPropDesc(name
); 
1381     if (! prop
.CanSet()) 
1384         s 
<< _T("property <") << name 
<< _T("> is readonly"); 
1385         throw exception(s
.mb_str()); 
1388     VARIANT v 
= {prop
.arg
.vt
}; 
1389     VariantToMSWVariant(value
, v
); 
1390     SetProp(prop
.memid
, v
); 
1391     VariantClear(&v
); // this releases any BSTR's etc 
1394 VARIANT 
wxActiveX::GetPropAsVariant(MEMBERID name
) 
1399     DISPPARAMS params 
= {NULL
, NULL
, 0, 0}; 
1402     memset(&x
, 0, sizeof(x
)); 
1403     unsigned int argErr 
= 0; 
1405     HRESULT hr 
= m_Dispatch
->Invoke( 
1407         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYGET
, 
1408         ¶ms
, &v
, &x
, &argErr
); 
1410     WXOLE_WARN(hr
, "Invoke Prop(...)"); 
1415 VARIANT 
wxActiveX::GetPropAsVariant(const wxString
& name
) 
1417     const PropX
& prop 
= GetPropDesc(name
); 
1418     if (! prop
.CanGet()) 
1421         s 
<< _T("property <") << name 
<< _T("> is writeonly"); 
1422         throw exception(s
.mb_str()); 
1425     return GetPropAsVariant(prop
.memid
); 
1428 wxVariant 
wxActiveX::GetPropAsWxVariant(const wxString
& name
) 
1430     VARIANT v 
= GetPropAsVariant(name
); 
1431     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BSTR
); 
1432     if (! SUCCEEDED(hr
)) 
1433         throw exception("Unable to convert variant"); 
1436     MSWVariantToVariant(v
, wv
); 
1443 wxString 
wxActiveX::GetPropAsString(const wxString
& name
) 
1445     VARIANT v 
= GetPropAsVariant(name
); 
1446     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BSTR
); 
1447     if (! SUCCEEDED(hr
)) 
1448         throw exception("Unable to convert variant"); 
1450     wxString s 
= v
.bstrVal
; 
1456 char wxActiveX::GetPropAsChar(const wxString
& name
) 
1458     VARIANT v 
= GetPropAsVariant(name
); 
1459     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_I1
); 
1460     if (! SUCCEEDED(hr
)) 
1461         throw exception("Unable to convert variant"); 
1466 long wxActiveX::GetPropAsLong(const wxString
& name
) 
1468     VARIANT v 
= GetPropAsVariant(name
); 
1469     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_I4
); 
1470     if (! SUCCEEDED(hr
)) 
1471         throw exception("Unable to convert variant"); 
1476 bool wxActiveX::GetPropAsBool(const wxString
& name
) 
1478     VARIANT v 
= GetPropAsVariant(name
); 
1479     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BOOL
); 
1480     if (! SUCCEEDED(hr
)) 
1481         throw exception("Unable to convert variant"); 
1483     return v
.boolVal 
!= 0; 
1486 double wxActiveX::GetPropAsDouble(const wxString
& name
) 
1488     VARIANT v 
= GetPropAsVariant(name
); 
1489     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_R8
); 
1490     if (! SUCCEEDED(hr
)) 
1491         throw exception("Unable to convert variant"); 
1496 wxDateTime 
wxActiveX::GetPropAsDateTime(const wxString
& name
) 
1499     VARIANT v 
= GetPropAsVariant(name
); 
1501     if (! VariantToWxDateTime(v
, dt
)) 
1502         throw exception("Unable to convert variant to wxDateTime"); 
1507 void *wxActiveX::GetPropAsPointer(const wxString
& name
) 
1509     VARIANT v 
= GetPropAsVariant(name
); 
1510     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BYREF
); 
1511     if (! SUCCEEDED(hr
)) 
1512         throw exception("Unable to convert variant"); 
1520 VARIANT 
wxActiveX::CallMethod(MEMBERID name
, VARIANTARG args
[], int argc
) 
1522     DISPPARAMS pargs 
= {args
, NULL
, argc
, 0}; 
1524     VariantInit(&retVal
); 
1527     memset(&x
, 0, sizeof(x
)); 
1528     unsigned int argErr 
= 0; 
1530     HRESULT hr 
= m_Dispatch
->Invoke( 
1532         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_METHOD
, 
1533         &pargs
, &retVal
, &x
, &argErr
); 
1535     WXOLE_WARN(hr
, "Invoke Method(...)"); 
1539 VARIANT 
wxActiveX::CallMethod(const wxString
& name
, VARIANTARG args
[], int argc
) 
1541     const FuncX
& func 
= GetMethodDesc(name
); 
1543         argc 
= func
.params
.size(); 
1545     return CallMethod(func
.memid
, args
, argc
); 
1549 wxVariant 
wxActiveX::CallMethod(const wxString
& name
, wxVariant args
[], int nargs
) 
1551     const FuncX
& func 
= GetMethodDesc(name
); 
1556     VARIANTARG 
*vargs 
= NULL
; 
1558         nargs 
= func
.params
.size(); 
1561         vargs 
= new VARIANTARG
[nargs
]; 
1565         // init type of vargs 
1566         for (int i 
= 0; i 
< nargs
; i
++) 
1567             vargs
[nargs 
- i 
- 1].vt 
= func
.params
[i
].vt
; 
1570         for (i 
= 0; i 
< nargs
; i
++) 
1571             VariantToMSWVariant(args
[i
], vargs
[nargs 
- i 
- 1]); 
1574     VARIANT rv 
= CallMethod(func
.memid
, vargs
, nargs
); 
1576     // process any by ref params 
1579         for (int i 
= 0; i 
< nargs
; i
++) 
1581             VARIANTARG
& va 
= vargs
[nargs 
- i 
- 1]; 
1582             const wxActiveX::ParamX 
&px 
= func
.params
[i
]; 
1586                 wxVariant
& vx 
= args
[i
]; 
1588                 MSWVariantToVariant(va
, vx
); 
1595         for (int i 
= 0; i 
< nargs
; i
++) 
1596             VariantClear(&vargs
[i
]); 
1602     MSWVariantToVariant(rv
, ret
); 
1609 /////////////////////////////////////////////// 
1611 HRESULT 
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown 
*events
) 
1613     wxOleConnectionPoint    cp
; 
1614     DWORD                   adviseCookie 
= 0; 
1616     wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
); 
1617     if (! cpContainer
.Ok()) 
1620     HRESULT hret 
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef()); 
1621     if (! SUCCEEDED(hret
)) 
1624     hret 
= cp
->Advise(events
, &adviseCookie
); 
1626     if (SUCCEEDED(hret
)) 
1627         m_connections
.push_back(wxOleConnection(cp
, adviseCookie
)); 
1630         WXOLE_WARN(hret
, "ConnectAdvise"); 
1636 HRESULT 
wxActiveX::AmbientPropertyChanged(DISPID dispid
) 
1638     wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
); 
1640     if (oleControl
.Ok()) 
1641         return oleControl
->OnAmbientPropertyChange(dispid
); 
1646 #define HIMETRIC_PER_INCH   2540 
1647 #define MAP_PIX_TO_LOGHIM(x,ppli)   MulDiv(HIMETRIC_PER_INCH, (x), (ppli)) 
1649 static void PixelsToHimetric(SIZEL 
&sz
) 
1651     static int logX 
= 0; 
1652     static int logY 
= 0; 
1657         HDC dc 
= GetDC(NULL
); 
1658         logX 
= GetDeviceCaps(dc
, LOGPIXELSX
); 
1659         logY 
= GetDeviceCaps(dc
, LOGPIXELSY
); 
1660         ReleaseDC(NULL
, dc
); 
1663 #define HIMETRIC_INCH   2540 
1664 #define CONVERT(x, logpixels)   MulDiv(HIMETRIC_INCH, (x), (logpixels)) 
1666     sz
.cx 
= CONVERT(sz
.cx
, logX
); 
1667     sz
.cy 
= CONVERT(sz
.cy
, logY
); 
1670 #undef HIMETRIC_INCH 
1674 void wxActiveX::OnSize(wxSizeEvent
& event
) 
1677     GetClientSize(&w
, &h
); 
1685     if (w 
<= 0 && h 
<= 0) 
1688     // extents are in HIMETRIC units 
1689     if (m_oleObject
.Ok()) 
1692         PixelsToHimetric(sz
); 
1696         m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
); 
1697         if (sz2
.cx 
!=  sz
.cx 
|| sz
.cy 
!= sz2
.cy
) 
1698             m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
); 
1701     if (m_oleInPlaceObject
.Ok())  
1702         m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
1705 void wxActiveX::OnPaint(wxPaintEvent
& event
) 
1707     wxLogTrace(wxT(""),wxT("repainting activex win")); 
1717     // Draw only when control is windowless or deactivated 
1720         ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
); 
1722             RECTL 
*prcBounds 
= (RECTL 
*) &posRect
; 
1723             m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
,  
1724                 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0); 
1729         dc
.SetBrush(*wxRED_BRUSH
); 
1730         dc
.DrawRectangle(0, 0, w
, h
); 
1731         dc
.SetBrush(wxNullBrush
); 
1736 void wxActiveX::OnMouse(wxMouseEvent
& event
) 
1738     if (m_oleObjectHWND 
== NULL
)  
1740         wxLogTrace(wxT(""),wxT("no oleInPlaceObject"));  
1745     wxLogTrace(wxT(""),wxT("mouse event")); 
1749     LRESULT lResult 
= 0; 
1751     if (event
.m_metaDown
)  
1752         wParam 
|= MK_CONTROL
; 
1753     if (event
.m_shiftDown
)  
1755     if (event
.m_leftDown
)  
1756         wParam 
|= MK_LBUTTON
; 
1757     if (event
.m_middleDown
)  
1758         wParam 
|= MK_MBUTTON
; 
1759     if (event
.m_rightDown
)  
1760         wParam 
|= MK_RBUTTON
; 
1761     lParam 
= event
.m_x 
<< 16; 
1762     lParam 
|= event
.m_y
; 
1764     if (event
.LeftDown())  
1765         msg 
= WM_LBUTTONDOWN
; 
1766     else if (event
.LeftDClick())  
1767         msg 
= WM_LBUTTONDBLCLK
; 
1768     else if (event
.LeftUp())  
1770     else if (event
.MiddleDown())  
1771         msg 
= WM_MBUTTONDOWN
; 
1772     else if (event
.MiddleDClick())  
1773         msg 
= WM_MBUTTONDBLCLK
; 
1774     else if (event
.MiddleUp())  
1776     else if (event
.RightDown())  
1777         msg 
= WM_RBUTTONDOWN
; 
1778     else if (event
.RightDClick())  
1779         msg 
= WM_RBUTTONDBLCLK
; 
1780     else if (event
.RightUp())  
1782     else if (event
.Moving() || event
.Dragging())  
1788         wxLogTrace(wxT(""),wxT("no message")); 
1789         event
.Skip(); return;  
1792     if (!::SendMessage(m_oleObjectHWND
, msg
, wParam
, lParam
))  
1794         wxLogTrace(wxT(""),wxT("msg not delivered")); 
1799     wxLogTrace(wxT(""),wxT("msg sent")); 
1802 bool wxActiveX::MSWTranslateMessage(WXMSG 
*msg
){ 
1804         if (msg
->message 
== WM_KEYDOWN
){                 
1805                 HRESULT result 
= m_oleInPlaceActiveObject
->TranslateAccelerator(msg
); 
1806                 return (result 
== S_OK
); 
1809         return wxWindow::MSWTranslateMessage(msg
); 
1812 long wxActiveX::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
1814     if (m_oleObjectHWND 
== NULL
) 
1815         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1824     case WM_SYSDEADCHAR
: 
1827         PostMessage(m_oleObjectHWND
, nMsg
, wParam
, lParam
); 
1830         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1834 void wxActiveX::OnSetFocus(wxFocusEvent
& event
) 
1836     if (m_oleInPlaceActiveObject
.Ok())  
1837         m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
); 
1840 void wxActiveX::OnKillFocus(wxFocusEvent
& event
) 
1842     if (m_oleInPlaceActiveObject
.Ok())  
1843         m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
); 
1847 FrameSite::FrameSite(wxActiveX 
* win
) 
1850     m_bSupportsWindowlessActivation 
= true; 
1851     m_bInPlaceLocked 
= false; 
1852     m_bUIActive 
= false; 
1853     m_bInPlaceActive 
= false; 
1854     m_bWindowless 
= false; 
1856     m_nAmbientLocale 
= 0; 
1857     m_clrAmbientForeColor 
= ::GetSysColor(COLOR_WINDOWTEXT
); 
1858     m_clrAmbientBackColor 
= ::GetSysColor(COLOR_WINDOW
); 
1859     m_bAmbientShowHatching 
= true; 
1860     m_bAmbientShowGrabHandles 
= true; 
1861     m_bAmbientAppearance 
= true; 
1864     m_hWndParent 
= (HWND
)m_window
->GetHWND(); 
1867 FrameSite::~FrameSite() 
1874 HRESULT 
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR 
** rgszNames
, unsigned int cNames
, 
1875                                  LCID lcid
, DISPID 
* rgDispId
) 
1877     WXOLE_TRACE("IDispatch::GetIDsOfNames"); 
1881 HRESULT 
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo 
** ppTInfo
) 
1883     WXOLE_TRACE("IDispatch::GetTypeInfo"); 
1887 HRESULT 
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
) 
1889     WXOLE_TRACE("IDispatch::GetTypeInfoCount"); 
1893 HRESULT 
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
1894                           WORD wFlags
, DISPPARAMS 
* pDispParams
, 
1895                           VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
1896                           unsigned int * puArgErr
) 
1898     WXOLE_TRACE("IDispatch::Invoke"); 
1900     if (!(wFlags 
& DISPATCH_PROPERTYGET
)) 
1905     if (pVarResult 
== NULL
)  
1906         return E_INVALIDARG
; 
1908     //The most common case is boolean, use as an initial type 
1909     V_VT(pVarResult
) = VT_BOOL
; 
1911     switch (dispIdMember
) 
1913         case DISPID_AMBIENT_MESSAGEREFLECT
: 
1914             WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT"); 
1915             V_BOOL(pVarResult
)= FALSE
; 
1918         case DISPID_AMBIENT_DISPLAYASDEFAULT
: 
1919             WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT"); 
1920             V_BOOL(pVarResult
)= TRUE
; 
1923         case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
: 
1924             WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED"); 
1925             V_BOOL(pVarResult
) = TRUE
; 
1929         case DISPID_AMBIENT_SILENT
: 
1930             WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT"); 
1931             V_BOOL(pVarResult
)= TRUE
; 
1934         case DISPID_AMBIENT_APPEARANCE
: 
1935             pVarResult
->vt 
= VT_BOOL
; 
1936             pVarResult
->boolVal 
= m_bAmbientAppearance
; 
1939         case DISPID_AMBIENT_FORECOLOR
: 
1940             pVarResult
->vt 
= VT_I4
; 
1941             pVarResult
->lVal 
= (long) m_clrAmbientForeColor
; 
1944         case DISPID_AMBIENT_BACKCOLOR
: 
1945             pVarResult
->vt 
= VT_I4
; 
1946             pVarResult
->lVal 
= (long) m_clrAmbientBackColor
; 
1949         case DISPID_AMBIENT_LOCALEID
: 
1950             pVarResult
->vt 
= VT_I4
; 
1951             pVarResult
->lVal 
= (long) m_nAmbientLocale
; 
1954         case DISPID_AMBIENT_USERMODE
: 
1955             pVarResult
->vt 
= VT_BOOL
; 
1956             pVarResult
->boolVal 
= m_window
->m_bAmbientUserMode
; 
1959         case DISPID_AMBIENT_SHOWGRABHANDLES
: 
1960             pVarResult
->vt 
= VT_BOOL
; 
1961             pVarResult
->boolVal 
= m_bAmbientShowGrabHandles
; 
1964         case DISPID_AMBIENT_SHOWHATCHING
: 
1965             pVarResult
->vt 
= VT_BOOL
; 
1966             pVarResult
->boolVal 
= m_bAmbientShowHatching
; 
1970             return DISP_E_MEMBERNOTFOUND
; 
1978 HRESULT 
FrameSite::GetWindow(HWND 
* phwnd
) 
1980     WXOLE_TRACE("IOleWindow::GetWindow"); 
1982         return E_INVALIDARG
; 
1983     (*phwnd
) = m_hWndParent
; 
1987 HRESULT 
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
) 
1989     WXOLE_TRACE("IOleWindow::ContextSensitiveHelp"); 
1993 //IOleInPlaceUIWindow 
1995 HRESULT 
FrameSite::GetBorder(LPRECT lprectBorder
) 
1997     WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder"); 
1998     if (lprectBorder 
== NULL
)  
1999         return E_INVALIDARG
; 
2000     return INPLACE_E_NOTOOLSPACE
; 
2003 HRESULT 
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
2005     WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace"); 
2006     if (pborderwidths 
== NULL
)  
2007         return E_INVALIDARG
; 
2008     return INPLACE_E_NOTOOLSPACE
; 
2011 HRESULT 
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
2013     WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace"); 
2017 HRESULT 
FrameSite::SetActiveObject(IOleInPlaceActiveObject 
*pActiveObject
, LPCOLESTR pszObjName
) 
2019     WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject"); 
2022         pActiveObject
->AddRef(); 
2024     m_window
->m_oleInPlaceActiveObject 
= pActiveObject
; 
2030 HRESULT 
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
) 
2032     WXOLE_TRACE("IOleInPlaceFrame::InsertMenus"); 
2036 HRESULT 
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
) 
2038     WXOLE_TRACE("IOleInPlaceFrame::SetMenu"); 
2042 HRESULT 
FrameSite::RemoveMenus(HMENU hmenuShared
) 
2044     WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus"); 
2048 HRESULT 
FrameSite::SetStatusText(LPCOLESTR pszStatusText
) 
2050     WXOLE_TRACE("IOleInPlaceFrame::SetStatusText"); 
2051     //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText); 
2055 HRESULT 
FrameSite::EnableModeless(BOOL fEnable
) 
2057     WXOLE_TRACE("IOleInPlaceFrame::EnableModeless"); 
2061 HRESULT 
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
) 
2063     WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator"); 
2064     // TODO: send an event with this id 
2065     if (m_window
->m_oleInPlaceActiveObject
.Ok()) 
2066         m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
); 
2073 HRESULT 
FrameSite::CanInPlaceActivate() 
2075     WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate"); 
2079 HRESULT 
FrameSite::OnInPlaceActivate() 
2081     WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate"); 
2082     m_bInPlaceActive 
= true; 
2086 HRESULT 
FrameSite::OnUIActivate() 
2088     WXOLE_TRACE("IOleInPlaceSite::OnUIActivate"); 
2093 HRESULT 
FrameSite::GetWindowContext(IOleInPlaceFrame 
**ppFrame
, 
2094                                     IOleInPlaceUIWindow 
**ppDoc
, 
2096                                     LPRECT lprcClipRect
, 
2097                                     LPOLEINPLACEFRAMEINFO lpFrameInfo
) 
2099     WXOLE_TRACE("IOleInPlaceSite::GetWindowContext"); 
2100     if (ppFrame 
== NULL 
|| ppDoc 
== NULL 
|| lprcPosRect 
== NULL 
|| 
2101         lprcClipRect 
== NULL 
|| lpFrameInfo 
== NULL
) 
2103         if (ppFrame 
!= NULL
)  
2107         return E_INVALIDARG
; 
2110     HRESULT hr 
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
); 
2111     if (! SUCCEEDED(hr
)) 
2113         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !"); 
2114         return E_UNEXPECTED
; 
2117     hr 
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
); 
2118     if (! SUCCEEDED(hr
)) 
2120         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !"); 
2121         (*ppFrame
)->Release(); 
2123         return E_UNEXPECTED
; 
2127     m_window
->GetClientSize(&w
, &h
); 
2130         lprcPosRect
->left 
= lprcPosRect
->top 
= 0; 
2131         lprcPosRect
->right 
= w
; 
2132         lprcPosRect
->bottom 
= h
; 
2136         lprcClipRect
->left 
= lprcClipRect
->top 
= 0; 
2137         lprcClipRect
->right 
= w
; 
2138         lprcClipRect
->bottom 
= h
; 
2141     memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
)); 
2142     lpFrameInfo
->cb 
= sizeof(OLEINPLACEFRAMEINFO
); 
2143     lpFrameInfo
->hwndFrame 
= m_hWndParent
; 
2148 HRESULT 
FrameSite::Scroll(SIZE scrollExtent
) 
2150     WXOLE_TRACE("IOleInPlaceSite::Scroll"); 
2154 HRESULT 
FrameSite::OnUIDeactivate(BOOL fUndoable
) 
2156     WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate"); 
2157     m_bUIActive 
= false; 
2161 HRESULT 
FrameSite::OnInPlaceDeactivate() 
2163     WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate"); 
2164     m_bInPlaceActive 
= false; 
2168 HRESULT 
FrameSite::DiscardUndoState() 
2170     WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState"); 
2174 HRESULT 
FrameSite::DeactivateAndUndo() 
2176     WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo"); 
2180 HRESULT 
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
) 
2182     WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange"); 
2183     if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
) 
2184         m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
); 
2191 HRESULT 
FrameSite::OnInPlaceActivateEx(BOOL 
* pfNoRedraw
, DWORD dwFlags
) 
2193     WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx"); 
2194     OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
); 
2196         (*pfNoRedraw
) = FALSE
; 
2200 HRESULT 
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
) 
2202     WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx"); 
2203     OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
); 
2207 HRESULT 
FrameSite::RequestUIActivate() 
2209     WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate"); 
2216 HRESULT 
FrameSite::SaveObject() 
2218     WXOLE_TRACE("IOleClientSite::SaveObject"); 
2222 const char *OleGetMonikerToStr(DWORD dwAssign
) 
2226     case OLEGETMONIKER_ONLYIFTHERE  
: return "OLEGETMONIKER_ONLYIFTHERE"; 
2227     case OLEGETMONIKER_FORCEASSIGN  
: return "OLEGETMONIKER_FORCEASSIGN"; 
2228     case OLEGETMONIKER_UNASSIGN     
: return "OLEGETMONIKER_UNASSIGN"; 
2229     case OLEGETMONIKER_TEMPFORUSER  
: return "OLEGETMONIKER_TEMPFORUSER";     
2230     default                         : return "Bad Enum"; 
2234 const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker
) 
2236     switch(dwWhichMoniker
) 
2238     case OLEWHICHMK_CONTAINER   
: return "OLEWHICHMK_CONTAINER"; 
2239     case OLEWHICHMK_OBJREL      
: return "OLEWHICHMK_OBJREL"; 
2240     case OLEWHICHMK_OBJFULL     
: return "OLEWHICHMK_OBJFULL"; 
2241     default                     : return "Bad Enum"; 
2245 HRESULT 
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
, 
2248     WXOLE_TRACEOUT("IOleClientSite::GetMoniker(" << OleGetMonikerToStr(dwAssign
) << ", " << OleGetWhicMonikerStr(dwWhichMoniker
) << ")"); 
2255     HRESULT hr = CreateFileMoniker(L"e:\\dev\\wxie\\bug-zap.swf", ppmk); 
2264 HRESULT 
FrameSite::GetContainer(LPOLECONTAINER 
* ppContainer
) 
2266     WXOLE_TRACE("IOleClientSite::GetContainer"); 
2267     if (ppContainer 
== NULL
)  
2268         return E_INVALIDARG
; 
2270     HRESULT hr 
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
)); 
2271     wxASSERT(SUCCEEDED(hr
)); 
2276 HRESULT 
FrameSite::ShowObject() 
2278     WXOLE_TRACE("IOleClientSite::ShowObject"); 
2279     if (m_window
->m_oleObjectHWND
) 
2280         ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
); 
2284 HRESULT 
FrameSite::OnShowWindow(BOOL fShow
) 
2286     WXOLE_TRACE("IOleClientSite::OnShowWindow"); 
2290 HRESULT 
FrameSite::RequestNewObjectLayout() 
2292     WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout"); 
2296 // IParseDisplayName 
2298 HRESULT 
FrameSite::ParseDisplayName(IBindCtx 
*pbc
, LPOLESTR pszDisplayName
, 
2299                                     ULONG 
*pchEaten
, IMoniker 
**ppmkOut
) 
2301     WXOLE_TRACE("IParseDisplayName::ParseDisplayName"); 
2307 HRESULT 
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown 
**ppenum
) 
2309     WXOLE_TRACE("IOleContainer::EnumObjects"); 
2313 HRESULT 
FrameSite::LockContainer(BOOL fLock
) 
2315     WXOLE_TRACE("IOleContainer::LockContainer"); 
2322 HRESULT 
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
,  
2323                              IBindCtx 
* pbc
, REFIID riid
, void ** ppvObject
) 
2325     WXOLE_TRACE("IOleItemContainer::GetObject"); 
2326     if (pszItem 
== NULL
)  
2327         return E_INVALIDARG
; 
2328     if (ppvObject 
== NULL
)  
2329         return E_INVALIDARG
; 
2332     return MK_E_NOOBJECT
; 
2335 HRESULT 
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx 
* pbc
,  
2336                                     REFIID riid
, void ** ppvStorage
) 
2338     WXOLE_TRACE("IOleItemContainer::GetObjectStorage"); 
2339     if (pszItem 
== NULL
)  
2340         return E_INVALIDARG
; 
2341     if (ppvStorage 
== NULL
)  
2342         return E_INVALIDARG
; 
2345     return MK_E_NOOBJECT
; 
2348 HRESULT 
FrameSite::IsRunning(LPOLESTR pszItem
) 
2350     WXOLE_TRACE("IOleItemContainer::IsRunning"); 
2351     if (pszItem 
== NULL
)  
2352         return E_INVALIDARG
; 
2354     return MK_E_NOOBJECT
; 
2361 HRESULT 
FrameSite::OnControlInfoChanged() 
2363     WXOLE_TRACE("IOleControlSite::OnControlInfoChanged"); 
2367 HRESULT 
FrameSite::LockInPlaceActive(BOOL fLock
) 
2369     WXOLE_TRACE("IOleControlSite::LockInPlaceActive"); 
2370     m_bInPlaceLocked 
= (fLock
) ? true : false; 
2374 HRESULT 
FrameSite::GetExtendedControl(IDispatch 
** ppDisp
) 
2376     WXOLE_TRACE("IOleControlSite::GetExtendedControl"); 
2380 HRESULT 
FrameSite::TransformCoords(POINTL 
* pPtlHimetric
, POINTF 
* pPtfContainer
, DWORD dwFlags
) 
2382     WXOLE_TRACE("IOleControlSite::TransformCoords"); 
2385     if (pPtlHimetric 
== NULL
) 
2386         return E_INVALIDARG
; 
2388     if (pPtfContainer 
== NULL
) 
2389         return E_INVALIDARG
; 
2395 HRESULT 
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
) 
2397     WXOLE_TRACE("IOleControlSite::TranslateAccelerator"); 
2398     // TODO: send an event with this id 
2402 HRESULT 
FrameSite::OnFocus(BOOL fGotFocus
) 
2404     WXOLE_TRACE("IOleControlSite::OnFocus"); 
2408 HRESULT 
FrameSite::ShowPropertyFrame() 
2410     WXOLE_TRACE("IOleControlSite::ShowPropertyFrame"); 
2416 HRESULT 
FrameSite::QueryStatus(const GUID 
* pguidCmdGroup
, ULONG cCmds
,  
2417                                OLECMD 
* prgCmds
, OLECMDTEXT 
* pCmdTet
) 
2419     WXOLE_TRACE("IOleCommandTarget::QueryStatus"); 
2420     if (prgCmds 
== NULL
) return E_INVALIDARG
; 
2421     bool bCmdGroupFound 
= false; 
2423     for (ULONG nCmd 
= 0; nCmd 
< cCmds
; nCmd
++) 
2425         // unsupported by default 
2426         prgCmds
[nCmd
].cmdf 
= 0; 
2431     if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
2435 HRESULT 
FrameSite::Exec(const GUID 
* pguidCmdGroup
, DWORD nCmdID
,  
2436                         DWORD nCmdExecOpt
, VARIANTARG 
* pVaIn
,  
2437                         VARIANTARG 
* pVaOut
) 
2439     WXOLE_TRACE("IOleCommandTarget::Exec"); 
2440     bool bCmdGroupFound 
= false; 
2442     if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
2443     return OLECMDERR_E_NOTSUPPORTED
; 
2448 void STDMETHODCALLTYPE 
FrameSite::OnDataChange(FORMATETC 
* pFormatEtc
, STGMEDIUM 
* pgStgMed
) 
2450     WXOLE_TRACE("IAdviseSink::OnDataChange"); 
2453 void STDMETHODCALLTYPE 
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
) 
2455     WXOLE_TRACE("IAdviseSink::OnViewChange"); 
2456     // redraw the control 
2459 void STDMETHODCALLTYPE 
FrameSite::OnRename(IMoniker 
* pmk
) 
2461     WXOLE_TRACE("IAdviseSink::OnRename"); 
2464 void STDMETHODCALLTYPE 
FrameSite::OnSave() 
2466     WXOLE_TRACE("IAdviseSink::OnSave"); 
2469 void STDMETHODCALLTYPE 
FrameSite::OnClose() 
2471     WXOLE_TRACE("IAdviseSink::OnClose"); 
2474 ///////////////////////////////////////////// 
2476 HRESULT STDMETHODCALLTYPE 
FrameSite::ActivateMe( 
2477         /* [in] */ IOleDocumentView __RPC_FAR 
*pViewToActivate
) 
2479     wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch 
*) this); 
2480     if (!inPlaceSite
.Ok()) 
2483     if (pViewToActivate
) 
2485         m_window
->m_docView 
= pViewToActivate
; 
2486         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
2490         wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
); 
2494         HRESULT hr 
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef()); 
2498         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
2501     m_window
->m_docView
->UIActivate(TRUE
); 
2507 static IMalloc 
*iMalloc 
= NULL
; 
2509 IMalloc 
*wxOleInit::GetIMalloc() 
2515 wxOleInit::wxOleInit() 
2517     if (OleInitialize(NULL
) == S_OK 
&& iMalloc 
== NULL
) 
2518         CoGetMalloc(1, &iMalloc
); 
2523 wxOleInit::~wxOleInit() 
2527         if (iMalloc
->Release() == 0) 
2534 bool GetSysErrMessage(int err
, wxString
& s
) 
2538         FORMAT_MESSAGE_FROM_SYSTEM
, NULL
, 
2539         err
,0, buf
, sizeof(buf
), NULL
) == 0) 
2542     buf
[sizeof(buf
) - 1] = 0; 
2547 wxString 
OLEHResultToString(HRESULT hr
) 
2549     // try formatmessage 
2551     if (GetSysErrMessage(hr
, err
)) 
2557         return wxEmptyString
; 
2559     case CONNECT_E_CANNOTCONNECT
: 
2560         return _T("Cannot connect to event interface (maybe not there ?) - see MSDN"); 
2562     case DISP_E_MEMBERNOTFOUND
: 
2563         return _T("The requested member does not exist, or the call to Invoke tried to set the value of a read-only property."); 
2565     case DISP_E_BADVARTYPE
: 
2566         return _T("One of the parameters in rgvarg is not a valid variant type."); 
2568     case DISP_E_BADPARAMCOUNT
: 
2569         return _T("The number of elements provided to DISPPARAMS is different from the number of parameters accepted by the method or property"); 
2571     case DISP_E_EXCEPTION
: 
2572         return _T("The application needs to raise an exception. In this case, the structure passed in pExcepInfo should be filled in."); 
2574     case DISP_E_TYPEMISMATCH
: 
2575         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."); 
2577     case DISP_E_PARAMNOTOPTIONAL
: 
2578         return _T("A required parameter was omitted."); 
2580     case DISP_E_PARAMNOTFOUND
: 
2581         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."); 
2583     case OLECMDERR_E_UNKNOWNGROUP
: 
2584         return _T("The pguidCmdGroup parameter is not NULL but does not specify a recognized command group."); 
2586     case OLECMDERR_E_NOTSUPPORTED
: 
2587         return _T("The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup."); 
2589     case OLECMDERR_E_DISABLED
: 
2590         return _T("The command identified by nCmdID is currently disabled and cannot be executed."); 
2592     case OLECMDERR_E_NOHELP
: 
2593         return _T("The caller has asked for help on the command identified by nCmdID, but no help is available."); 
2595     case OLECMDERR_E_CANCELED
: 
2596         return _T("The user canceled the execution of the command."); 
2599         return _T("E_INVALIDARG"); 
2602         return _T("E_OUTOFMEMORY"); 
2605         return _T("E_NOINTERFACE"); 
2608         return _T("E_UNEXPECTED"); 
2610     case STG_E_INVALIDFLAG
: 
2611         return _T("STG_E_INVALIDFLAG"); 
2614         return _T("E_FAIL"); 
2617         return _T("E_NOTIMPL"); 
2622             buf
.Printf(_T("Unknown - 0x%X"), hr
); 
2628 // borrowed from src/msw/ole/oleutils.cpp 
2629 wxString 
GetIIDName(REFIID riid
) 
2631   // an association between symbolic name and numeric value of an IID 
2635     const wxChar 
*szName
; 
2638   // construct the table containing all known interfaces 
2639   #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) } 
2640   #define ADD_KNOWN_GUID(name) { &name, _T(#name) } 
2642   static const KNOWN_IID aKnownIids
[] =  
2644     ADD_KNOWN_IID(ServiceProvider
), 
2645     ADD_KNOWN_IID(AdviseSink
), 
2646     ADD_KNOWN_IID(AdviseSink2
), 
2647     ADD_KNOWN_IID(BindCtx
), 
2648     ADD_KNOWN_IID(ClassFactory
), 
2649 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__) 
2650     ADD_KNOWN_IID(ContinueCallback
), 
2651     ADD_KNOWN_IID(EnumOleDocumentViews
), 
2652     ADD_KNOWN_IID(OleCommandTarget
), 
2653     ADD_KNOWN_IID(OleDocument
), 
2654     ADD_KNOWN_IID(OleDocumentSite
), 
2655     ADD_KNOWN_IID(OleDocumentView
), 
2656     ADD_KNOWN_IID(Print
), 
2658     ADD_KNOWN_IID(DataAdviseHolder
), 
2659     ADD_KNOWN_IID(DataObject
), 
2660     ADD_KNOWN_IID(Debug
), 
2661     ADD_KNOWN_IID(DebugStream
), 
2662     ADD_KNOWN_IID(DfReserved1
), 
2663     ADD_KNOWN_IID(DfReserved2
), 
2664     ADD_KNOWN_IID(DfReserved3
), 
2665     ADD_KNOWN_IID(Dispatch
), 
2666     ADD_KNOWN_IID(DropSource
), 
2667     ADD_KNOWN_IID(DropTarget
), 
2668     ADD_KNOWN_IID(EnumCallback
), 
2669     ADD_KNOWN_IID(EnumFORMATETC
), 
2670     ADD_KNOWN_IID(EnumGeneric
), 
2671     ADD_KNOWN_IID(EnumHolder
), 
2672     ADD_KNOWN_IID(EnumMoniker
), 
2673     ADD_KNOWN_IID(EnumOLEVERB
), 
2674     ADD_KNOWN_IID(EnumSTATDATA
), 
2675     ADD_KNOWN_IID(EnumSTATSTG
), 
2676     ADD_KNOWN_IID(EnumString
), 
2677     ADD_KNOWN_IID(EnumUnknown
), 
2678     ADD_KNOWN_IID(EnumVARIANT
), 
2679     ADD_KNOWN_IID(ExternalConnection
), 
2680     ADD_KNOWN_IID(InternalMoniker
), 
2681     ADD_KNOWN_IID(LockBytes
), 
2682     ADD_KNOWN_IID(Malloc
), 
2683     ADD_KNOWN_IID(Marshal
), 
2684     ADD_KNOWN_IID(MessageFilter
), 
2685     ADD_KNOWN_IID(Moniker
), 
2686     ADD_KNOWN_IID(OleAdviseHolder
), 
2687     ADD_KNOWN_IID(OleCache
), 
2688     ADD_KNOWN_IID(OleCache2
), 
2689     ADD_KNOWN_IID(OleCacheControl
), 
2690     ADD_KNOWN_IID(OleClientSite
), 
2691     ADD_KNOWN_IID(OleContainer
), 
2692     ADD_KNOWN_IID(OleInPlaceActiveObject
), 
2693     ADD_KNOWN_IID(OleInPlaceFrame
), 
2694     ADD_KNOWN_IID(OleInPlaceObject
), 
2695     ADD_KNOWN_IID(OleInPlaceSite
), 
2696     ADD_KNOWN_IID(OleInPlaceUIWindow
), 
2697     ADD_KNOWN_IID(OleItemContainer
), 
2698     ADD_KNOWN_IID(OleLink
), 
2699     ADD_KNOWN_IID(OleManager
), 
2700     ADD_KNOWN_IID(OleObject
), 
2701     ADD_KNOWN_IID(OlePresObj
), 
2702     ADD_KNOWN_IID(OleWindow
), 
2703     ADD_KNOWN_IID(PSFactory
), 
2704     ADD_KNOWN_IID(ParseDisplayName
), 
2705     ADD_KNOWN_IID(Persist
), 
2706     ADD_KNOWN_IID(PersistFile
), 
2707     ADD_KNOWN_IID(PersistStorage
), 
2708     ADD_KNOWN_IID(PersistStream
), 
2709     ADD_KNOWN_IID(ProxyManager
), 
2710     ADD_KNOWN_IID(RootStorage
), 
2711     ADD_KNOWN_IID(RpcChannel
), 
2712     ADD_KNOWN_IID(RpcProxy
), 
2713     ADD_KNOWN_IID(RpcStub
), 
2714     ADD_KNOWN_IID(RunnableObject
), 
2715     ADD_KNOWN_IID(RunningObjectTable
), 
2716     ADD_KNOWN_IID(StdMarshalInfo
), 
2717     ADD_KNOWN_IID(Storage
), 
2718     ADD_KNOWN_IID(Stream
), 
2719     ADD_KNOWN_IID(StubManager
), 
2720     ADD_KNOWN_IID(Unknown
), 
2721     ADD_KNOWN_IID(ViewObject
), 
2722     ADD_KNOWN_IID(ViewObject2
), 
2723     ADD_KNOWN_GUID(IID_IDispatch
), 
2724     ADD_KNOWN_GUID(IID_IWebBrowser
), 
2725     ADD_KNOWN_GUID(IID_IWebBrowserApp
), 
2726     ADD_KNOWN_GUID(IID_IWebBrowser2
), 
2727     ADD_KNOWN_GUID(IID_IWebBrowser
), 
2728     ADD_KNOWN_GUID(DIID_DWebBrowserEvents2
), 
2729     ADD_KNOWN_GUID(DIID_DWebBrowserEvents
), 
2732   // don't clobber preprocessor name space 
2733   #undef ADD_KNOWN_IID 
2734   #undef ADD_KNOWN_GUID 
2736   // try to find the interface in the table 
2737   for ( size_t ui 
= 0; ui 
< WXSIZEOF(aKnownIids
); ui
++ )  
2739     if ( riid 
== *aKnownIids
[ui
].pIid 
)  
2741       return aKnownIids
[ui
].szName
; 
2745   // unknown IID, just transform to string 
2746   LPOLESTR str 
= NULL
; 
2747   StringFromIID(riid
, &str
); 
2755       return _T("StringFromIID() error");