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
); 
 303 void wxActiveX::CreateActiveX(REFCLSID clsid
) 
 309     //////////////////////////////////////////////////////// 
 311     FrameSite 
*frame 
= new FrameSite(this); 
 313     hret 
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch 
*) frame
); 
 314     wxCHECK_RET(SUCCEEDED(hret
), _T("m_clientSite.QueryInterface failed")); 
 316     wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch 
*) frame
); 
 317     wxCHECK_RET(adviseSink
.Ok(), _T("adviseSink not Ok")); 
 320     // // Create Object, get IUnknown interface 
 321     m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
); 
 322     wxCHECK_RET(m_ActiveX
.Ok(), _T("m_ActiveX.CreateInstance failed")); 
 324     // Get Dispatch interface 
 325     hret 
= m_Dispatch
.QueryInterface(IID_IDispatch
, m_ActiveX
);  
 326     WXOLE_WARN(hret
, "Unable to get dispatch interface"); 
 331     // Get IOleObject interface 
 332     hret 
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);  
 333     wxCHECK_RET(SUCCEEDED(hret
), _("Unable to get IOleObject interface")); 
 335     // get IViewObject Interface 
 336     hret 
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
);  
 337     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IViewObject Interface")); 
 340     m_docAdviseCookie 
= 0; 
 341     hret 
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
); 
 342     WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")"); 
 343     m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
); 
 344     OleSetContainedObject(m_oleObject
, TRUE
); 
 348     // Get IOleInPlaceObject interface 
 349     hret 
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
); 
 350     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IOleInPlaceObject interface")); 
 354     m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
); 
 355     wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get oleObject status")); 
 357     // set client site first ? 
 358     if (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
) 
 359         m_oleObject
->SetClientSite(m_clientSite
); 
 363     wxAutoOleInterface
<IPersistStreamInit
> 
 364         pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
); 
 366     if (pPersistStreamInit
.Ok()) 
 368         hret 
= pPersistStreamInit
->InitNew(); 
 369         WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()"); 
 372     if (! (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
)) 
 373         m_oleObject
->SetClientSite(m_clientSite
); 
 377     GetClientSize(&w
, &h
); 
 386     if (m_oleInPlaceObject
.Ok()) 
 388         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 389         WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 391             ::SetActiveWindow(m_oleObjectHWND
); 
 395     if (! (dwMiscStatus 
& OLEMISC_INVISIBLEATRUNTIME
)) 
 397         if (w 
> 0 && h 
> 0 && m_oleInPlaceObject
.Ok()) 
 398             m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
 400         hret 
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 401         hret 
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 404     if (! m_oleObjectHWND 
&& m_oleInPlaceObject
.Ok()) 
 406         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 407         WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 412         ::SetActiveWindow(m_oleObjectHWND
); 
 413         ::ShowWindow(m_oleObjectHWND
, SW_SHOW
); 
 415         // Update by GBR to resize older controls 
 417         szEvent
.m_size 
= wxSize(w
, h
) ; 
 418         AddPendingEvent(szEvent
); 
 422 void wxActiveX::CreateActiveX(LPOLESTR progId
) 
 425     if (CLSIDFromProgID(progId
, &clsid
) != S_OK
) 
 428     CreateActiveX(clsid
); 
 431 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 432 // Case Insensitive Map of Event names to eventTypes 
 433 // created dynamically at run time in: 
 434 //      EVT_ACTIVEX(eventName, id, fn) 
 435 // we map the pointer to them so that: 
 436 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 437 // can return a const reference, which is neccessary for event tables 
 438 // probably should use a wxWindows hash table here, but I'm lazy ... 
 439 typedef map
<wxString
, wxEventType 
*, NS_wxActiveX::less_wxStringI
> ActiveXNamedEventMap
; 
 440 static ActiveXNamedEventMap sg_NamedEventMap
; 
 442 const wxEventType
& RegisterActiveXEvent(const wxChar 
*eventName
) 
 444     wxString ev 
= eventName
; 
 445     ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.find(ev
); 
 446     if (it 
== sg_NamedEventMap
.end()) 
 448         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 449         sg_NamedEventMap
[ev
] = et
; 
 454     return *(it
->second
); 
 458 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 459 // Map of Event DISPID's to eventTypes 
 460 // created dynamically at run time in: 
 461 //      EVT_ACTIVEX(eventName, id, fn) 
 462 // we map the pointer to them so that: 
 463 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 464 // can return a const reference, which is neccessary for event tables 
 466 typedef map
<DISPID
, wxEventType 
*> ActiveXDISPIDEventMap
; 
 467 static ActiveXDISPIDEventMap sg_dispIdEventMap
; 
 469 const wxEventType
& RegisterActiveXEvent(DISPID event
) 
 471     ActiveXDISPIDEventMap::iterator it 
= sg_dispIdEventMap
.find(event
); 
 472     if (it 
== sg_dispIdEventMap
.end()) 
 474         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 475         sg_dispIdEventMap
[event
] = et
; 
 480     return *(it
->second
); 
 483 // one off class for automatic freeing of activeX eventtypes 
 484 class ActiveXEventMapFlusher
 
 487     ~ActiveXEventMapFlusher() 
 490         ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.end(); 
 491         while (it 
!= sg_NamedEventMap
.end()) 
 496         sg_NamedEventMap
.clear(); 
 499         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.end(); 
 500         while (dit 
!= sg_dispIdEventMap
.end()) 
 505         sg_dispIdEventMap
.clear(); 
 509 static ActiveXEventMapFlusher s_dummyActiveXEventMapFlusher
; 
 512 ////////////////////////////////////////////////////// 
 513 VARTYPE 
wxTypeToVType(const wxVariant
& v
) 
 515     wxString type 
= v
.GetType(); 
 516     if (type 
== wxT("bool")) 
 518     else if (type 
== wxT("char")) 
 520     else if (type 
== wxT("datetime")) 
 522     else if (type 
== wxT("double")) 
 524     else if (type 
== wxT("list")) 
 526     else if (type 
== wxT("long")) 
 528     else if (type 
== wxT("string")) 
 530     else if (type 
== wxT("stringlist")) 
 532     else if (type 
== wxT("date")) 
 534     else if (type 
== wxT("time")) 
 536     else if (type 
== wxT("void*")) 
 537         return VT_VOID 
| VT_BYREF
; 
 542 bool wxDateTimeToDATE(wxDateTime dt
, DATE
& d
) 
 545     memset(&st
, 0, sizeof(st
)); 
 547     st
.wYear 
= dt
.GetYear(); 
 548     st
.wMonth 
= dt
.GetMonth() + 1; 
 549     st
.wDay 
= dt
.GetDay(); 
 550     st
.wHour 
= dt
.GetHour(); 
 551     st
.wMinute 
= dt
.GetMinute(); 
 552     st
.wSecond 
= dt
.GetSecond(); 
 553     st
.wMilliseconds 
= dt
.GetMillisecond(); 
 554     return SystemTimeToVariantTime(&st
, &d
) != FALSE
; 
 557 bool wxDateTimeToVariant(wxDateTime dt
, VARIANTARG
& va
) 
 559     return wxDateTimeToDATE(dt
, va
.date
); 
 562 bool DATEToWxDateTime(DATE date
, wxDateTime
& dt
) 
 565     if (! VariantTimeToSystemTime(date
, &st
)) 
 570         wxDateTime::Month(int(wxDateTime::Jan
) + st
.wMonth 
- 1),  
 572         st
.wHour
, st
.wMinute
, st
.wSecond
, st
.wMilliseconds
); 
 577 bool VariantToWxDateTime(VARIANTARG va
, wxDateTime
& dt
) 
 579     HRESULT hr 
= VariantChangeType(&va
, &va
, 0, VT_DATE
); 
 583     return DATEToWxDateTime(va
.date
, dt
); 
 586 bool MSWVariantToVariant(VARIANTARG
& va
, wxVariant
& vx
) 
 592         return false; // don't support arrays yet 
 605             return MSWVariantToVariant(*va
.pvarVal
, vx
); 
 609             VariantChangeType(&tmp
, &tmp
, 0, wxTypeToVType(vx
)); 
 610             bool rc 
= MSWVariantToVariant(tmp
, vx
); 
 619             vx 
= (char) *va
.pbVal
; 
 628             vx 
= (long) *va
.puiVal
; 
 630             vx 
= (long) va
.uiVal
; 
 640             vx 
= (long) *va
.pulVal
; 
 642             vx 
= (long) va
.ulVal
; 
 664             vx 
= (*va
.pboolVal 
? true : false); 
 666             vx 
= (va
.boolVal 
? true : false); 
 671         return false; // what the hell is a CY ? 
 678                 hr 
= VarR8FromDec(va
.pdecVal
, &d
); 
 680                 hr 
= VarR8FromDec(&va
.decVal
, &d
); 
 683             return SUCCEEDED(hr
); 
 691                 rc 
= DATEToWxDateTime(*va
.pdate
, dt
); 
 693                 rc 
= VariantToWxDateTime(va
, dt
); 
 700             vx 
= wxString(*va
.pbstrVal
); 
 702             vx 
= wxString(va
.bstrVal
); 
 705     case VT_UNKNOWN
: // should do a custom wxVariantData for this 
 707             vx 
= (void *) *va
.ppunkVal
; 
 709             vx 
= (void *) va
.punkVal
; 
 712     case VT_DISPATCH
: // should do a custom wxVariantData for this 
 714             vx 
= (void *) *va
.ppdispVal
; 
 716             vx 
= (void *) va
.pdispVal
; 
 725 bool VariantToMSWVariant(const wxVariant
& vx
, VARIANTARG
& va
) 
 731         return false; // don't support arrays yet 
 743             return VariantToMSWVariant(vx
, *va
.pvarVal
); 
 746             va
.vt 
= wxTypeToVType(vx
); 
 747             return VariantToMSWVariant(vx
, va
); 
 754             *va
.pbVal 
= (char) vx
; 
 763             *va
.puiVal 
= (long) vx
; 
 765             va
.uiVal 
= (long) vx
; 
 775             *va
.pulVal 
= (long) vx
; 
 777             va
.ulVal 
= (long) vx
; 
 784             *va
.pfltVal 
= (double) vx
; 
 786             va
.fltVal 
= (double) vx
; 
 792             *va
.pdblVal 
= (double) vx
; 
 794             va
.dblVal 
= (double) vx
; 
 799             *va
.pboolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 801             va
.boolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 805         return false; // what the hell is a CY ? 
 809             return SUCCEEDED(VarDecFromR8(vx
, va
.pdecVal
)); 
 811             return SUCCEEDED(VarDecFromR8(vx
, &va
.decVal
)); 
 815             return wxDateTimeToDATE(vx
, *va
.pdate
); 
 817             return wxDateTimeToVariant(vx
,va
); 
 821             *va
.pbstrVal 
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
)); 
 823             va
.bstrVal 
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
)); 
 826     case VT_UNKNOWN
: // should do a custom wxVariantData for this 
 828             *va
.ppunkVal 
= (IUnknown 
*) (void *) vx
; 
 830             va
.punkVal 
= (IUnknown 
*) (void *) vx
; 
 833     case VT_DISPATCH
: // should do a custom wxVariantData for this 
 835             *va
.ppdispVal 
= (IDispatch 
*) (void *) vx
; 
 837             va
.pdispVal 
= (IDispatch 
*) (void *) vx
; 
 845 IMPLEMENT_CLASS(wxActiveXEvent
, wxCommandEvent
) 
 847 class wxActiveXEvents 
: public IDispatch
 
 850     DECLARE_OLE_UNKNOWN(wxActiveXEvents
); 
 853     wxActiveX   
*m_activeX
; 
 857     friend bool wxActiveXEventsInterface(wxActiveXEvents 
*self
, REFIID iid
, void **_interface
, const char *&desc
); 
 860     wxActiveXEvents(wxActiveX 
*ax
) : m_activeX(ax
), m_haveCustomId(false) {} 
 861     wxActiveXEvents(wxActiveX 
*ax
, REFIID iid
) : m_activeX(ax
), m_haveCustomId(true), m_customId(iid
) {} 
 862     virtual ~wxActiveXEvents()  
 867     STDMETHODIMP 
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
) 
 872     STDMETHODIMP 
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
) 
 877     STDMETHODIMP 
GetTypeInfoCount(unsigned int* i
) 
 883     void DispatchEvent(wxActiveX::FuncX 
&func
, const wxEventType
& eventType
, DISPPARAMS 
* pDispParams
) 
 885         wxActiveXEvent  event
; 
 886         event
.SetId(m_activeX
->GetId()); 
 887         event
.SetEventType(eventType
); 
 888         event
.m_params
.NullList(); 
 889         event
.m_params
.SetName(func
.name
); 
 895             // sometimes the pDispParams does not match the param info for a activex control 
 896             int nArg 
= min(func
.params
.size(), pDispParams
->cArgs
); 
 897             for (int i 
= nArg 
- 1; i 
>= 0; i
--) 
 899                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 900                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 904                 MSWVariantToVariant(va
, vx
); 
 905                 event
.m_params
.Append(vx
); 
 911             int nArg 
= min(func
.params
.size(), pDispParams
->cArgs
); 
 912             m_activeX
->GetParent()->ProcessEvent(event
); 
 913             for (int i 
= 0; i 
< nArg
; i
++) 
 915                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 916                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 920                     wxVariant
& vx 
= event
.m_params
[nArg 
- i 
- 1]; 
 922                     VariantToMSWVariant(vx
, va
); 
 927             m_activeX
->GetParent()->AddPendingEvent(event
); 
 931     STDMETHODIMP 
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
 932                           WORD wFlags
, DISPPARAMS 
* pDispParams
, 
 933                           VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
 934                           unsigned int * puArgErr
) 
 936         if (wFlags 
& (DISPATCH_PROPERTYGET 
| DISPATCH_PROPERTYPUT 
| DISPATCH_PROPERTYPUTREF
)) 
 941         // find event for dispid  
 942         wxActiveX::MemberIdMap::iterator mit 
= m_activeX
->m_eventMemberIds
.find((MEMBERID
) dispIdMember
); 
 943         if (mit 
== m_activeX
->m_eventMemberIds
.end()) 
 947         int midx 
= mit
->second
; 
 948         if (midx 
< 0 || midx 
>= m_activeX
->GetEventCount()) 
 951         wxActiveX::FuncX 
&func 
= m_activeX
->m_events
[midx
]; 
 954         // try to find dispid event 
 955         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.find(dispIdMember
); 
 956         if (dit 
!= sg_dispIdEventMap
.end()) 
 959             DispatchEvent(func
, *(dit
->second
), pDispParams
); 
 964         ActiveXNamedEventMap::iterator nit 
= sg_NamedEventMap
.find(func
.name
); 
 965         if (nit 
== sg_NamedEventMap
.end()) 
 969         DispatchEvent(func
, *(nit
->second
), pDispParams
); 
 974 bool wxActiveXEventsInterface(wxActiveXEvents 
*self
, REFIID iid
, void **_interface
, const char *&desc
) 
 976     if (self
->m_haveCustomId 
&& IsEqualIID(iid
, self
->m_customId
)) 
 978         WXOLE_TRACE("Found Custom Dispatch Interface"); 
 979         *_interface 
= (IUnknown 
*) (IDispatch 
*) self
; 
 980         desc 
= "Custom Dispatch Interface"; 
 987 DEFINE_OLE_TABLE(wxActiveXEvents
) 
 988     OLE_IINTERFACE(IUnknown
) 
 989     OLE_INTERFACE(IID_IDispatch
, IDispatch
) 
 990     OLE_INTERFACE_CUSTOM(wxActiveXEventsInterface
) 
 993 wxString 
wxActiveXEvent::EventName() 
 995     return m_params
.GetName(); 
 998 int wxActiveXEvent::ParamCount() const 
1000     return m_params
.GetCount(); 
1003 wxString 
wxActiveXEvent::ParamType(int idx
) 
1005     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
1007     return m_params
[idx
].GetType(); 
1010 wxString 
wxActiveXEvent::ParamName(int idx
) 
1012     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
1014     return m_params
[idx
].GetName(); 
1017 static wxVariant nullVar
; 
1019 wxVariant
& wxActiveXEvent::operator[] (int idx
) 
1021     wxASSERT(idx 
>= 0 && idx 
< ParamCount()); 
1023     return m_params
[idx
]; 
1026 wxVariant
& wxActiveXEvent::operator[] (wxString name
) 
1028     for (int i 
= 0; i 
< m_params
.GetCount(); i
++) 
1030         if (name
.CmpNoCase(m_params
[i
].GetName()) == 0) 
1034     wxString err 
= _T("wxActiveXEvent::operator[] invalid name <") + name 
+ _T(">"); 
1035     err 
+= _T("\r\nValid Names = :\r\n"); 
1036     for (i 
= 0; i 
< m_params
.GetCount(); i
++) 
1038         err 
+= m_params
[i
].GetName(); 
1042     wxASSERT_MSG(false, err
); 
1047 void wxActiveX::GetTypeInfo() 
1050     We are currently only interested in the IDispatch interface  
1051     to the control. For dual interfaces (TypeKind = TKIND_INTERFACE) 
1052     we should drill down through the inheritance  
1053     (using TYPEATTR->cImplTypes) and GetRefTypeOfImplType(n) 
1054     and retrieve all the func names etc that way, then generate a C++  
1057     But we don't do this and probably never will, so if we have a DUAL  
1058     interface then we query for the IDispatch  
1059     via GetRefTypeOfImplType(-1). 
1064     // get type info via class info 
1065     wxAutoOleInterface
<IProvideClassInfo
> classInfo(IID_IProvideClassInfo
, m_ActiveX
); 
1066     if (! classInfo
.Ok()) 
1070     wxAutoOleInterface
<ITypeInfo
> typeInfo
; 
1071     hret 
= classInfo
->GetClassInfo(typeInfo
.GetRef()); 
1072     if (! typeInfo
.Ok()) 
1076     TYPEATTR 
*ta 
= NULL
; 
1077     hret 
= typeInfo
->GetTypeAttr(&ta
); 
1081     // this should be a TKIND_COCLASS 
1082     wxASSERT(ta
->typekind 
== TKIND_COCLASS
); 
1084     // iterate contained interfaces 
1085     for (int i 
= 0; i 
< ta
->cImplTypes
; i
++) 
1089         // get dispatch type info handle 
1090         hret 
= typeInfo
->GetRefTypeOfImplType(i
, &rt
); 
1091         if (! SUCCEEDED(hret
)) 
1094         // get dispatch type info interface 
1095         wxAutoOleInterface
<ITypeInfo
>  ti
; 
1096         hret 
= typeInfo
->GetRefTypeInfo(rt
, ti
.GetRef()); 
1100         // check if default event sink 
1101         bool defInterface 
= false; 
1102         bool defEventSink 
= false; 
1103         int impTypeFlags 
= 0; 
1104         typeInfo
->GetImplTypeFlags(i
, &impTypeFlags
); 
1106         if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULT
) 
1108             if (impTypeFlags 
& IMPLTYPEFLAG_FSOURCE
) 
1110                 WXOLE_TRACEOUT("Default Event Sink"); 
1111                 defEventSink 
= true; 
1112                 if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULTVTABLE
) 
1114                     WXOLE_TRACEOUT("*ERROR* - Default Event Sink is via vTable"); 
1115                     defEventSink 
= false; 
1120                 WXOLE_TRACEOUT("Default Interface"); 
1121                 defInterface 
= true; 
1127         GetTypeInfo(ti
, defInterface
, defEventSink
); 
1132     typeInfo
->ReleaseTypeAttr(ta
); 
1135 void ElemDescToParam(const ELEMDESC
& ed
, wxActiveX::ParamX
& param
) 
1137     param
.flags 
= ed
.idldesc
.wIDLFlags
; 
1138     param
.vt 
= ed
.tdesc
.vt
; 
1139     param
.isPtr 
= (param
.vt 
== VT_PTR
); 
1140     param
.isSafeArray 
= (param
.vt 
== VT_SAFEARRAY
); 
1141     if (param
.isPtr 
|| param
.isSafeArray
) 
1142         param
.vt 
= ed
.tdesc
.lptdesc
->vt
; 
1145 void wxActiveX::GetTypeInfo(ITypeInfo 
*ti
, bool defInterface
, bool defEventSink
) 
1147     // wxAutoOleInterface<> assumes a ref has already been added 
1149     wxAutoOleInterface
<ITypeInfo
> typeInfo(ti
); 
1152     TYPEATTR 
*ta 
= NULL
; 
1153     HRESULT hret 
= typeInfo
->GetTypeAttr(&ta
); 
1157     if (ta
->typekind 
== TKIND_DISPATCH
) 
1159         WXOLE_TRACEOUT("GUID = " << GetIIDName(ta
->guid
).c_str()); 
1163             wxActiveXEvents 
*disp 
= new wxActiveXEvents(this, ta
->guid
); 
1164             ConnectAdvise(ta
->guid
, disp
); 
1168         // Get Function Names 
1169         for (int i 
= 0; i 
< ta
->cFuncs
; i
++) 
1171             FUNCDESC FAR 
*fd 
= NULL
; 
1173             hret 
= typeInfo
->GetFuncDesc(i
, &fd
); 
1177             BSTR anames
[1] = {NULL
}; 
1180             hret 
= typeInfo
->GetNames(fd
->memid
, anames
, 1, &n
); 
1184                 wxString name 
= anames
[0]; 
1186                 WXOLE_TRACEOUT("Name " << i 
<< " = " << name
.c_str()); 
1187                 SysFreeString(anames
[0]); 
1189                 if (defInterface 
|| defEventSink
) 
1193                     func
.memid 
= fd
->memid
; 
1194                     func
.hasOut 
= false; 
1197                     unsigned int maxPNames 
= fd
->cParams 
+ 1; 
1198                     unsigned int nPNames 
= 0; 
1199                     BSTR 
*pnames 
= new BSTR
[maxPNames
]; 
1201                     hret 
= typeInfo
->GetNames(fd
->memid
, pnames
, maxPNames
, &nPNames
); 
1204                     if (fd
->cParams 
< int(nPNames
)) 
1207                         SysFreeString(pnames
[0]); 
1211                     ElemDescToParam(fd
->elemdescFunc
, func
.retType
); 
1212                     for (int p 
= 0; p 
< fd
->cParams
; p
++) 
1216                         ElemDescToParam(fd
->lprgelemdescParam
[p
], param
); 
1218                         param
.name 
= pnames
[pbase 
+ p
]; 
1219                         SysFreeString(pnames
[pbase 
+ p
]); 
1221                         param
.isOptional 
= (p 
> fd
->cParams 
- fd
->cParamsOpt
); 
1223                         func
.hasOut 
|= (param
.IsOut() || param
.isPtr
); 
1224                         func
.params
.push_back(param
); 
1230                         m_events
.push_back(func
); 
1231                         m_eventMemberIds
[fd
->memid
] = m_events
.size() - 1; 
1235                         if (fd
->invkind 
== INVOKE_FUNC
) 
1237                             m_methods
.push_back(func
); 
1238                             m_methodNames
[func
.name
] = m_methods
.size() - 1; 
1242                             NameMap::iterator it 
= m_propNames
.find(func
.name
); 
1244                             if (it 
== m_propNames
.end()) 
1246                                 m_props
.push_back(PropX()); 
1247                                 idx 
= m_props
.size() - 1; 
1248                                 m_propNames
[func
.name
] = idx
; 
1249                                 m_props
[idx
].name 
= func
.name
; 
1250                                 m_props
[idx
].memid 
= func
.memid
; 
1256                             if (fd
->invkind 
== INVOKE_PROPERTYGET
) 
1257                                 m_props
[idx
].type 
= func
.retType
; 
1258                             else if (func
.params
.size() > 0) 
1260                                 m_props
[idx
].arg 
= func
.params
[0]; 
1261                                 m_props
[idx
].putByRef 
= (fd
->invkind 
== INVOKE_PROPERTYPUTREF
); 
1268             typeInfo
->ReleaseFuncDesc(fd
); 
1272     typeInfo
->ReleaseTypeAttr(ta
); 
1275 /////////////////////////////////////////////// 
1276 // Type Info exposure 
1277 const wxActiveX::FuncX
& wxActiveX::GetEventDesc(int idx
) const 
1279     wxASSERT(idx 
>= 0 && idx 
< GetEventCount()); 
1281     return m_events
[idx
]; 
1284 const wxActiveX::PropX
& wxActiveX::GetPropDesc(int idx
) const 
1286     if (idx 
< 0 || idx 
>= GetPropCount()) 
1287         throw exception("Property index out of bounds"); 
1289     return m_props
[idx
]; 
1292 const wxActiveX::PropX
& wxActiveX::GetPropDesc(const wxString
& name
) const 
1294     NameMap::const_iterator it 
= m_propNames
.find(name
); 
1295     if (it 
== m_propNames
.end()) 
1298         s 
<< _T("property <") << name 
<< _T("> not found"); 
1299         throw exception(s
.mb_str()); 
1302     return GetPropDesc(it
->second
); 
1305 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(int idx
) const 
1307     if (idx 
< 0 || idx 
>= GetMethodCount()) 
1308         throw exception("Method index out of bounds"); 
1311     return m_methods
[idx
]; 
1315 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(const wxString
& name
) const 
1317     NameMap::const_iterator it 
= m_methodNames
.find(name
); 
1318     if (it 
== m_methodNames
.end()) 
1321         s 
<< _T("method <") << name 
<< _T("> not found"); 
1322         throw exception(s
.mb_str()); 
1325     return GetMethodDesc(it
->second
); 
1329 void wxActiveX::SetProp(MEMBERID name
, VARIANTARG
& value
) 
1331     DISPID pids
[1] = {DISPID_PROPERTYPUT
}; 
1332     DISPPARAMS params 
= {&value
, pids
, 1, 1}; 
1335     memset(&x
, 0, sizeof(x
)); 
1336     unsigned int argErr 
= 0; 
1338     HRESULT hr 
= m_Dispatch
->Invoke( 
1340         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYPUT
, 
1341         ¶ms
, NULL
, &x
, &argErr
); 
1343     WXOLE_WARN(hr
, "Invoke Prop(...)"); 
1346 void wxActiveX::SetProp(const wxString 
&name
, const wxVariant 
&value
) 
1348     const PropX
& prop 
= GetPropDesc(name
); 
1349     if (! prop
.CanSet()) 
1352         s 
<< _T("property <") << name 
<< _T("> is readonly"); 
1353         throw exception(s
.mb_str()); 
1356     VARIANT v 
= {prop
.arg
.vt
}; 
1357     VariantToMSWVariant(value
, v
); 
1358     SetProp(prop
.memid
, v
); 
1359     VariantClear(&v
); // this releases any BSTR's etc 
1362 VARIANT 
wxActiveX::GetPropAsVariant(MEMBERID name
) 
1367     DISPPARAMS params 
= {NULL
, NULL
, 0, 0}; 
1370     memset(&x
, 0, sizeof(x
)); 
1371     unsigned int argErr 
= 0; 
1373     HRESULT hr 
= m_Dispatch
->Invoke( 
1375         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYGET
, 
1376         ¶ms
, &v
, &x
, &argErr
); 
1378     WXOLE_WARN(hr
, "Invoke Prop(...)"); 
1383 VARIANT 
wxActiveX::GetPropAsVariant(const wxString
& name
) 
1385     const PropX
& prop 
= GetPropDesc(name
); 
1386     if (! prop
.CanGet()) 
1389         s 
<< _T("property <") << name 
<< _T("> is writeonly"); 
1390         throw exception(s
.mb_str()); 
1393     return GetPropAsVariant(prop
.memid
); 
1396 wxVariant 
wxActiveX::GetPropAsWxVariant(const wxString
& name
) 
1398     VARIANT v 
= GetPropAsVariant(name
); 
1399     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BSTR
); 
1400     if (! SUCCEEDED(hr
)) 
1401         throw exception("Unable to convert variant"); 
1404     MSWVariantToVariant(v
, wv
); 
1411 wxString 
wxActiveX::GetPropAsString(const wxString
& name
) 
1413     VARIANT v 
= GetPropAsVariant(name
); 
1414     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BSTR
); 
1415     if (! SUCCEEDED(hr
)) 
1416         throw exception("Unable to convert variant"); 
1418     wxString s 
= v
.bstrVal
; 
1424 char wxActiveX::GetPropAsChar(const wxString
& name
) 
1426     VARIANT v 
= GetPropAsVariant(name
); 
1427     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_I1
); 
1428     if (! SUCCEEDED(hr
)) 
1429         throw exception("Unable to convert variant"); 
1434 long wxActiveX::GetPropAsLong(const wxString
& name
) 
1436     VARIANT v 
= GetPropAsVariant(name
); 
1437     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_I4
); 
1438     if (! SUCCEEDED(hr
)) 
1439         throw exception("Unable to convert variant"); 
1444 bool wxActiveX::GetPropAsBool(const wxString
& name
) 
1446     VARIANT v 
= GetPropAsVariant(name
); 
1447     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BOOL
); 
1448     if (! SUCCEEDED(hr
)) 
1449         throw exception("Unable to convert variant"); 
1451     return v
.boolVal 
!= 0; 
1454 double wxActiveX::GetPropAsDouble(const wxString
& name
) 
1456     VARIANT v 
= GetPropAsVariant(name
); 
1457     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_R8
); 
1458     if (! SUCCEEDED(hr
)) 
1459         throw exception("Unable to convert variant"); 
1464 wxDateTime 
wxActiveX::GetPropAsDateTime(const wxString
& name
) 
1467     VARIANT v 
= GetPropAsVariant(name
); 
1469     if (! VariantToWxDateTime(v
, dt
)) 
1470         throw exception("Unable to convert variant to wxDateTime"); 
1475 void *wxActiveX::GetPropAsPointer(const wxString
& name
) 
1477     VARIANT v 
= GetPropAsVariant(name
); 
1478     HRESULT hr 
= VariantChangeType(&v
, &v
, 0, VT_BYREF
); 
1479     if (! SUCCEEDED(hr
)) 
1480         throw exception("Unable to convert variant"); 
1488 VARIANT 
wxActiveX::CallMethod(MEMBERID name
, VARIANTARG args
[], int argc
) 
1490     DISPPARAMS pargs 
= {args
, NULL
, argc
, 0}; 
1492     VariantInit(&retVal
); 
1495     memset(&x
, 0, sizeof(x
)); 
1496     unsigned int argErr 
= 0; 
1498     HRESULT hr 
= m_Dispatch
->Invoke( 
1500         IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_METHOD
, 
1501         &pargs
, &retVal
, &x
, &argErr
); 
1503     WXOLE_WARN(hr
, "Invoke Method(...)"); 
1507 VARIANT 
wxActiveX::CallMethod(const wxString
& name
, VARIANTARG args
[], int argc
) 
1509     const FuncX
& func 
= GetMethodDesc(name
); 
1511         argc 
= func
.params
.size(); 
1513     return CallMethod(func
.memid
, args
, argc
); 
1517 wxVariant 
wxActiveX::CallMethod(const wxString
& name
, wxVariant args
[], int nargs
) 
1519     const FuncX
& func 
= GetMethodDesc(name
); 
1524     VARIANTARG 
*vargs 
= NULL
; 
1526         nargs 
= func
.params
.size(); 
1529         vargs 
= new VARIANTARG
[nargs
]; 
1533         // init type of vargs 
1534         for (int i 
= 0; i 
< nargs
; i
++) 
1535             vargs
[nargs 
- i 
- 1].vt 
= func
.params
[i
].vt
; 
1538         for (i 
= 0; i 
< nargs
; i
++) 
1539             VariantToMSWVariant(args
[i
], vargs
[nargs 
- i 
- 1]); 
1542     VARIANT rv 
= CallMethod(func
.memid
, vargs
, nargs
); 
1544     // process any by ref params 
1547         for (int i 
= 0; i 
< nargs
; i
++) 
1549             VARIANTARG
& va 
= vargs
[nargs 
- i 
- 1]; 
1550             const wxActiveX::ParamX 
&px 
= func
.params
[i
]; 
1554                 wxVariant
& vx 
= args
[i
]; 
1556                 MSWVariantToVariant(va
, vx
); 
1563         for (int i 
= 0; i 
< nargs
; i
++) 
1564             VariantClear(&vargs
[i
]); 
1570     MSWVariantToVariant(rv
, ret
); 
1577 /////////////////////////////////////////////// 
1579 HRESULT 
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown 
*events
) 
1581     wxOleConnectionPoint    cp
; 
1582     DWORD                   adviseCookie 
= 0; 
1584     wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
); 
1585     if (! cpContainer
.Ok()) 
1588     HRESULT hret 
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef()); 
1589     if (! SUCCEEDED(hret
)) 
1592     hret 
= cp
->Advise(events
, &adviseCookie
); 
1594     if (SUCCEEDED(hret
)) 
1595         m_connections
.push_back(wxOleConnection(cp
, adviseCookie
)); 
1598         WXOLE_WARN(hret
, "ConnectAdvise"); 
1604 HRESULT 
wxActiveX::AmbientPropertyChanged(DISPID dispid
) 
1606     wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
); 
1608     if (oleControl
.Ok()) 
1609         return oleControl
->OnAmbientPropertyChange(dispid
); 
1614 #define HIMETRIC_PER_INCH   2540 
1615 #define MAP_PIX_TO_LOGHIM(x,ppli)   MulDiv(HIMETRIC_PER_INCH, (x), (ppli)) 
1617 static void PixelsToHimetric(SIZEL 
&sz
) 
1619     static int logX 
= 0; 
1620     static int logY 
= 0; 
1625         HDC dc 
= GetDC(NULL
); 
1626         logX 
= GetDeviceCaps(dc
, LOGPIXELSX
); 
1627         logY 
= GetDeviceCaps(dc
, LOGPIXELSY
); 
1628         ReleaseDC(NULL
, dc
); 
1631 #define HIMETRIC_INCH   2540 
1632 #define CONVERT(x, logpixels)   MulDiv(HIMETRIC_INCH, (x), (logpixels)) 
1634     sz
.cx 
= CONVERT(sz
.cx
, logX
); 
1635     sz
.cy 
= CONVERT(sz
.cy
, logY
); 
1638 #undef HIMETRIC_INCH 
1642 void wxActiveX::OnSize(wxSizeEvent
& event
) 
1645     GetClientSize(&w
, &h
); 
1653     if (w 
<= 0 && h 
<= 0) 
1656     // extents are in HIMETRIC units 
1657     if (m_oleObject
.Ok()) 
1660         PixelsToHimetric(sz
); 
1664         m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
); 
1665         if (sz2
.cx 
!=  sz
.cx 
|| sz
.cy 
!= sz2
.cy
) 
1666             m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
); 
1669     if (m_oleInPlaceObject
.Ok())  
1670         m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
1673 void wxActiveX::OnPaint(wxPaintEvent
& event
) 
1675     wxLogTrace(wxT(""),wxT("repainting activex win")); 
1686     // Draw only when control is windowless or deactivated 
1689         ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
); 
1691             RECTL 
*prcBounds 
= (RECTL 
*) &posRect
; 
1692             m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
,  
1693                 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0); 
1698         dc
.SetBrush(*wxRED_BRUSH
); 
1699         dc
.DrawRectangle(0, 0, w
, h
); 
1700         dc
.SetBrush(wxNullBrush
); 
1706 void wxActiveX::OnMouse(wxMouseEvent
& event
) 
1708     if (m_oleObjectHWND 
== NULL
)  
1710         wxLogTrace(wxT(""),wxT("no oleInPlaceObject"));  
1715     wxLogTrace(wxT(""),wxT("mouse event")); 
1719     LRESULT lResult 
= 0; 
1721     if (event
.m_metaDown
)  
1722         wParam 
|= MK_CONTROL
; 
1723     if (event
.m_shiftDown
)  
1725     if (event
.m_leftDown
)  
1726         wParam 
|= MK_LBUTTON
; 
1727     if (event
.m_middleDown
)  
1728         wParam 
|= MK_MBUTTON
; 
1729     if (event
.m_rightDown
)  
1730         wParam 
|= MK_RBUTTON
; 
1731     lParam 
= event
.m_x 
<< 16; 
1732     lParam 
|= event
.m_y
; 
1734     if (event
.LeftDown())  
1735         msg 
= WM_LBUTTONDOWN
; 
1736     else if (event
.LeftDClick())  
1737         msg 
= WM_LBUTTONDBLCLK
; 
1738     else if (event
.LeftUp())  
1740     else if (event
.MiddleDown())  
1741         msg 
= WM_MBUTTONDOWN
; 
1742     else if (event
.MiddleDClick())  
1743         msg 
= WM_MBUTTONDBLCLK
; 
1744     else if (event
.MiddleUp())  
1746     else if (event
.RightDown())  
1747         msg 
= WM_RBUTTONDOWN
; 
1748     else if (event
.RightDClick())  
1749         msg 
= WM_RBUTTONDBLCLK
; 
1750     else if (event
.RightUp())  
1752     else if (event
.Moving() || event
.Dragging())  
1758         wxLogTrace(wxT(""),wxT("no message")); 
1759         event
.Skip(); return;  
1762     if (!::SendMessage(m_oleObjectHWND
, msg
, wParam
, lParam
))  
1764         wxLogTrace(wxT(""),wxT("msg not delivered")); 
1769     wxLogTrace(wxT(""),wxT("msg sent")); 
1772 long wxActiveX::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
1774     if (m_oleObjectHWND 
== NULL
) 
1775         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1784     case WM_SYSDEADCHAR
: 
1787         PostMessage(m_oleObjectHWND
, nMsg
, wParam
, lParam
); 
1790         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1794 void wxActiveX::OnSetFocus(wxFocusEvent
& event
) 
1796     if (m_oleInPlaceActiveObject
.Ok())  
1797         m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
); 
1800 void wxActiveX::OnKillFocus(wxFocusEvent
& event
) 
1802     if (m_oleInPlaceActiveObject
.Ok())  
1803         m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
); 
1807 FrameSite::FrameSite(wxActiveX 
* win
) 
1810     m_bSupportsWindowlessActivation 
= true; 
1811     m_bInPlaceLocked 
= false; 
1812     m_bUIActive 
= false; 
1813     m_bInPlaceActive 
= false; 
1814     m_bWindowless 
= false; 
1816     m_nAmbientLocale 
= 0; 
1817     m_clrAmbientForeColor 
= ::GetSysColor(COLOR_WINDOWTEXT
); 
1818     m_clrAmbientBackColor 
= ::GetSysColor(COLOR_WINDOW
); 
1819     m_bAmbientShowHatching 
= true; 
1820     m_bAmbientShowGrabHandles 
= true; 
1821     m_bAmbientAppearance 
= true; 
1824     m_hWndParent 
= (HWND
)m_window
->GetHWND(); 
1827 FrameSite::~FrameSite() 
1834 HRESULT 
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR 
** rgszNames
, unsigned int cNames
, 
1835                                  LCID lcid
, DISPID 
* rgDispId
) 
1837     WXOLE_TRACE("IDispatch::GetIDsOfNames"); 
1841 HRESULT 
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo 
** ppTInfo
) 
1843     WXOLE_TRACE("IDispatch::GetTypeInfo"); 
1847 HRESULT 
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
) 
1849     WXOLE_TRACE("IDispatch::GetTypeInfoCount"); 
1853 HRESULT 
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
1854                           WORD wFlags
, DISPPARAMS 
* pDispParams
, 
1855                           VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
1856                           unsigned int * puArgErr
) 
1858     WXOLE_TRACE("IDispatch::Invoke"); 
1860     if (!(wFlags 
& DISPATCH_PROPERTYGET
)) 
1865     if (pVarResult 
== NULL
)  
1866         return E_INVALIDARG
; 
1868     //The most common case is boolean, use as an initial type 
1869     V_VT(pVarResult
) = VT_BOOL
; 
1871     switch (dispIdMember
) 
1873         case DISPID_AMBIENT_MESSAGEREFLECT
: 
1874             WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT"); 
1875             V_BOOL(pVarResult
)= FALSE
; 
1878         case DISPID_AMBIENT_DISPLAYASDEFAULT
: 
1879             WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT"); 
1880             V_BOOL(pVarResult
)= TRUE
; 
1883         case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
: 
1884             WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED"); 
1885             V_BOOL(pVarResult
) = TRUE
; 
1889         case DISPID_AMBIENT_SILENT
: 
1890             WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT"); 
1891             V_BOOL(pVarResult
)= TRUE
; 
1894         case DISPID_AMBIENT_APPEARANCE
: 
1895             pVarResult
->vt 
= VT_BOOL
; 
1896             pVarResult
->boolVal 
= m_bAmbientAppearance
; 
1899         case DISPID_AMBIENT_FORECOLOR
: 
1900             pVarResult
->vt 
= VT_I4
; 
1901             pVarResult
->lVal 
= (long) m_clrAmbientForeColor
; 
1904         case DISPID_AMBIENT_BACKCOLOR
: 
1905             pVarResult
->vt 
= VT_I4
; 
1906             pVarResult
->lVal 
= (long) m_clrAmbientBackColor
; 
1909         case DISPID_AMBIENT_LOCALEID
: 
1910             pVarResult
->vt 
= VT_I4
; 
1911             pVarResult
->lVal 
= (long) m_nAmbientLocale
; 
1914         case DISPID_AMBIENT_USERMODE
: 
1915             pVarResult
->vt 
= VT_BOOL
; 
1916             pVarResult
->boolVal 
= m_window
->m_bAmbientUserMode
; 
1919         case DISPID_AMBIENT_SHOWGRABHANDLES
: 
1920             pVarResult
->vt 
= VT_BOOL
; 
1921             pVarResult
->boolVal 
= m_bAmbientShowGrabHandles
; 
1924         case DISPID_AMBIENT_SHOWHATCHING
: 
1925             pVarResult
->vt 
= VT_BOOL
; 
1926             pVarResult
->boolVal 
= m_bAmbientShowHatching
; 
1930             return DISP_E_MEMBERNOTFOUND
; 
1938 HRESULT 
FrameSite::GetWindow(HWND 
* phwnd
) 
1940     WXOLE_TRACE("IOleWindow::GetWindow"); 
1942         return E_INVALIDARG
; 
1943     (*phwnd
) = m_hWndParent
; 
1947 HRESULT 
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
) 
1949     WXOLE_TRACE("IOleWindow::ContextSensitiveHelp"); 
1953 //IOleInPlaceUIWindow 
1955 HRESULT 
FrameSite::GetBorder(LPRECT lprectBorder
) 
1957     WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder"); 
1958     if (lprectBorder 
== NULL
)  
1959         return E_INVALIDARG
; 
1960     return INPLACE_E_NOTOOLSPACE
; 
1963 HRESULT 
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
1965     WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace"); 
1966     if (pborderwidths 
== NULL
)  
1967         return E_INVALIDARG
; 
1968     return INPLACE_E_NOTOOLSPACE
; 
1971 HRESULT 
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
1973     WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace"); 
1977 HRESULT 
FrameSite::SetActiveObject(IOleInPlaceActiveObject 
*pActiveObject
, LPCOLESTR pszObjName
) 
1979     WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject"); 
1982         pActiveObject
->AddRef(); 
1984     m_window
->m_oleInPlaceActiveObject 
= pActiveObject
; 
1990 HRESULT 
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
) 
1992     WXOLE_TRACE("IOleInPlaceFrame::InsertMenus"); 
1996 HRESULT 
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
) 
1998     WXOLE_TRACE("IOleInPlaceFrame::SetMenu"); 
2002 HRESULT 
FrameSite::RemoveMenus(HMENU hmenuShared
) 
2004     WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus"); 
2008 HRESULT 
FrameSite::SetStatusText(LPCOLESTR pszStatusText
) 
2010     WXOLE_TRACE("IOleInPlaceFrame::SetStatusText"); 
2011     //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText); 
2015 HRESULT 
FrameSite::EnableModeless(BOOL fEnable
) 
2017     WXOLE_TRACE("IOleInPlaceFrame::EnableModeless"); 
2021 HRESULT 
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
) 
2023     WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator"); 
2024     // TODO: send an event with this id 
2025     if (m_window
->m_oleInPlaceActiveObject
.Ok()) 
2026         m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
); 
2033 HRESULT 
FrameSite::CanInPlaceActivate() 
2035     WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate"); 
2039 HRESULT 
FrameSite::OnInPlaceActivate() 
2041     WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate"); 
2042     m_bInPlaceActive 
= true; 
2046 HRESULT 
FrameSite::OnUIActivate() 
2048     WXOLE_TRACE("IOleInPlaceSite::OnUIActivate"); 
2053 HRESULT 
FrameSite::GetWindowContext(IOleInPlaceFrame 
**ppFrame
, 
2054                                     IOleInPlaceUIWindow 
**ppDoc
, 
2056                                     LPRECT lprcClipRect
, 
2057                                     LPOLEINPLACEFRAMEINFO lpFrameInfo
) 
2059     WXOLE_TRACE("IOleInPlaceSite::GetWindowContext"); 
2060     if (ppFrame 
== NULL 
|| ppDoc 
== NULL 
|| lprcPosRect 
== NULL 
|| 
2061         lprcClipRect 
== NULL 
|| lpFrameInfo 
== NULL
) 
2063         if (ppFrame 
!= NULL
)  
2067         return E_INVALIDARG
; 
2070     HRESULT hr 
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
); 
2071     if (! SUCCEEDED(hr
)) 
2073         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !"); 
2074         return E_UNEXPECTED
; 
2077     hr 
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
); 
2078     if (! SUCCEEDED(hr
)) 
2080         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !"); 
2081         (*ppFrame
)->Release(); 
2083         return E_UNEXPECTED
; 
2087     m_window
->GetClientSize(&w
, &h
); 
2090         lprcPosRect
->left 
= lprcPosRect
->top 
= 0; 
2091         lprcPosRect
->right 
= w
; 
2092         lprcPosRect
->bottom 
= h
; 
2096         lprcClipRect
->left 
= lprcClipRect
->top 
= 0; 
2097         lprcClipRect
->right 
= w
; 
2098         lprcClipRect
->bottom 
= h
; 
2101     memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
)); 
2102     lpFrameInfo
->cb 
= sizeof(OLEINPLACEFRAMEINFO
); 
2103     lpFrameInfo
->hwndFrame 
= m_hWndParent
; 
2108 HRESULT 
FrameSite::Scroll(SIZE scrollExtent
) 
2110     WXOLE_TRACE("IOleInPlaceSite::Scroll"); 
2114 HRESULT 
FrameSite::OnUIDeactivate(BOOL fUndoable
) 
2116     WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate"); 
2117     m_bUIActive 
= false; 
2121 HRESULT 
FrameSite::OnInPlaceDeactivate() 
2123     WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate"); 
2124     m_bInPlaceActive 
= false; 
2128 HRESULT 
FrameSite::DiscardUndoState() 
2130     WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState"); 
2134 HRESULT 
FrameSite::DeactivateAndUndo() 
2136     WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo"); 
2140 HRESULT 
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
) 
2142     WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange"); 
2143     if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
) 
2144         m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
); 
2151 HRESULT 
FrameSite::OnInPlaceActivateEx(BOOL 
* pfNoRedraw
, DWORD dwFlags
) 
2153     WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx"); 
2154     OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
); 
2156         (*pfNoRedraw
) = FALSE
; 
2160 HRESULT 
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
) 
2162     WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx"); 
2163     OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
); 
2167 HRESULT 
FrameSite::RequestUIActivate() 
2169     WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate"); 
2176 HRESULT 
FrameSite::SaveObject() 
2178     WXOLE_TRACE("IOleClientSite::SaveObject"); 
2182 const char *OleGetMonikerToStr(DWORD dwAssign
) 
2186     case OLEGETMONIKER_ONLYIFTHERE  
: return "OLEGETMONIKER_ONLYIFTHERE"; 
2187     case OLEGETMONIKER_FORCEASSIGN  
: return "OLEGETMONIKER_FORCEASSIGN"; 
2188     case OLEGETMONIKER_UNASSIGN     
: return "OLEGETMONIKER_UNASSIGN"; 
2189     case OLEGETMONIKER_TEMPFORUSER  
: return "OLEGETMONIKER_TEMPFORUSER";     
2190     default                         : return "Bad Enum"; 
2194 const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker
) 
2196     switch(dwWhichMoniker
) 
2198     case OLEWHICHMK_CONTAINER   
: return "OLEWHICHMK_CONTAINER"; 
2199     case OLEWHICHMK_OBJREL      
: return "OLEWHICHMK_OBJREL"; 
2200     case OLEWHICHMK_OBJFULL     
: return "OLEWHICHMK_OBJFULL"; 
2201     default                     : return "Bad Enum"; 
2205 HRESULT 
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
, 
2208     WXOLE_TRACEOUT("IOleClientSite::GetMoniker(" << OleGetMonikerToStr(dwAssign
) << ", " << OleGetWhicMonikerStr(dwWhichMoniker
) << ")"); 
2215     HRESULT hr = CreateFileMoniker(L"e:\\dev\\wxie\\bug-zap.swf", ppmk); 
2224 HRESULT 
FrameSite::GetContainer(LPOLECONTAINER 
* ppContainer
) 
2226     WXOLE_TRACE("IOleClientSite::GetContainer"); 
2227     if (ppContainer 
== NULL
)  
2228         return E_INVALIDARG
; 
2230     HRESULT hr 
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
)); 
2231     wxASSERT(SUCCEEDED(hr
)); 
2236 HRESULT 
FrameSite::ShowObject() 
2238     WXOLE_TRACE("IOleClientSite::ShowObject"); 
2239     if (m_window
->m_oleObjectHWND
) 
2240         ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
); 
2244 HRESULT 
FrameSite::OnShowWindow(BOOL fShow
) 
2246     WXOLE_TRACE("IOleClientSite::OnShowWindow"); 
2250 HRESULT 
FrameSite::RequestNewObjectLayout() 
2252     WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout"); 
2256 // IParseDisplayName 
2258 HRESULT 
FrameSite::ParseDisplayName(IBindCtx 
*pbc
, LPOLESTR pszDisplayName
, 
2259                                     ULONG 
*pchEaten
, IMoniker 
**ppmkOut
) 
2261     WXOLE_TRACE("IParseDisplayName::ParseDisplayName"); 
2267 HRESULT 
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown 
**ppenum
) 
2269     WXOLE_TRACE("IOleContainer::EnumObjects"); 
2273 HRESULT 
FrameSite::LockContainer(BOOL fLock
) 
2275     WXOLE_TRACE("IOleContainer::LockContainer"); 
2282 HRESULT 
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
,  
2283                              IBindCtx 
* pbc
, REFIID riid
, void ** ppvObject
) 
2285     WXOLE_TRACE("IOleItemContainer::GetObject"); 
2286     if (pszItem 
== NULL
)  
2287         return E_INVALIDARG
; 
2288     if (ppvObject 
== NULL
)  
2289         return E_INVALIDARG
; 
2292     return MK_E_NOOBJECT
; 
2295 HRESULT 
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx 
* pbc
,  
2296                                     REFIID riid
, void ** ppvStorage
) 
2298     WXOLE_TRACE("IOleItemContainer::GetObjectStorage"); 
2299     if (pszItem 
== NULL
)  
2300         return E_INVALIDARG
; 
2301     if (ppvStorage 
== NULL
)  
2302         return E_INVALIDARG
; 
2305     return MK_E_NOOBJECT
; 
2308 HRESULT 
FrameSite::IsRunning(LPOLESTR pszItem
) 
2310     WXOLE_TRACE("IOleItemContainer::IsRunning"); 
2311     if (pszItem 
== NULL
)  
2312         return E_INVALIDARG
; 
2314     return MK_E_NOOBJECT
; 
2321 HRESULT 
FrameSite::OnControlInfoChanged() 
2323     WXOLE_TRACE("IOleControlSite::OnControlInfoChanged"); 
2327 HRESULT 
FrameSite::LockInPlaceActive(BOOL fLock
) 
2329     WXOLE_TRACE("IOleControlSite::LockInPlaceActive"); 
2330     m_bInPlaceLocked 
= (fLock
) ? true : false; 
2334 HRESULT 
FrameSite::GetExtendedControl(IDispatch 
** ppDisp
) 
2336     WXOLE_TRACE("IOleControlSite::GetExtendedControl"); 
2340 HRESULT 
FrameSite::TransformCoords(POINTL 
* pPtlHimetric
, POINTF 
* pPtfContainer
, DWORD dwFlags
) 
2342     WXOLE_TRACE("IOleControlSite::TransformCoords"); 
2345     if (pPtlHimetric 
== NULL
) 
2346         return E_INVALIDARG
; 
2348     if (pPtfContainer 
== NULL
) 
2349         return E_INVALIDARG
; 
2355 HRESULT 
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
) 
2357     WXOLE_TRACE("IOleControlSite::TranslateAccelerator"); 
2358     // TODO: send an event with this id 
2362 HRESULT 
FrameSite::OnFocus(BOOL fGotFocus
) 
2364     WXOLE_TRACE("IOleControlSite::OnFocus"); 
2368 HRESULT 
FrameSite::ShowPropertyFrame() 
2370     WXOLE_TRACE("IOleControlSite::ShowPropertyFrame"); 
2376 HRESULT 
FrameSite::QueryStatus(const GUID 
* pguidCmdGroup
, ULONG cCmds
,  
2377                                OLECMD 
* prgCmds
, OLECMDTEXT 
* pCmdTet
) 
2379     WXOLE_TRACE("IOleCommandTarget::QueryStatus"); 
2380     if (prgCmds 
== NULL
) return E_INVALIDARG
; 
2381     bool bCmdGroupFound 
= false; 
2383     for (ULONG nCmd 
= 0; nCmd 
< cCmds
; nCmd
++) 
2385         // unsupported by default 
2386         prgCmds
[nCmd
].cmdf 
= 0; 
2391     if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
2395 HRESULT 
FrameSite::Exec(const GUID 
* pguidCmdGroup
, DWORD nCmdID
,  
2396                         DWORD nCmdExecOpt
, VARIANTARG 
* pVaIn
,  
2397                         VARIANTARG 
* pVaOut
) 
2399     WXOLE_TRACE("IOleCommandTarget::Exec"); 
2400     bool bCmdGroupFound 
= false; 
2402     if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
2403     return OLECMDERR_E_NOTSUPPORTED
; 
2408 void STDMETHODCALLTYPE 
FrameSite::OnDataChange(FORMATETC 
* pFormatEtc
, STGMEDIUM 
* pgStgMed
) 
2410     WXOLE_TRACE("IAdviseSink::OnDataChange"); 
2413 void STDMETHODCALLTYPE 
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
) 
2415     WXOLE_TRACE("IAdviseSink::OnViewChange"); 
2416     // redraw the control 
2419 void STDMETHODCALLTYPE 
FrameSite::OnRename(IMoniker 
* pmk
) 
2421     WXOLE_TRACE("IAdviseSink::OnRename"); 
2424 void STDMETHODCALLTYPE 
FrameSite::OnSave() 
2426     WXOLE_TRACE("IAdviseSink::OnSave"); 
2429 void STDMETHODCALLTYPE 
FrameSite::OnClose() 
2431     WXOLE_TRACE("IAdviseSink::OnClose"); 
2434 ///////////////////////////////////////////// 
2436 HRESULT STDMETHODCALLTYPE 
FrameSite::ActivateMe( 
2437         /* [in] */ IOleDocumentView __RPC_FAR 
*pViewToActivate
) 
2439     wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch 
*) this); 
2440     if (!inPlaceSite
.Ok()) 
2443     if (pViewToActivate
) 
2445         m_window
->m_docView 
= pViewToActivate
; 
2446         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
2450         wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
); 
2454         HRESULT hr 
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef()); 
2458         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
2461     m_window
->m_docView
->UIActivate(TRUE
); 
2467 static IMalloc 
*iMalloc 
= NULL
; 
2469 IMalloc 
*wxOleInit::GetIMalloc() 
2475 wxOleInit::wxOleInit() 
2477     if (OleInitialize(NULL
) == S_OK 
&& iMalloc 
== NULL
) 
2478         CoGetMalloc(1, &iMalloc
); 
2483 wxOleInit::~wxOleInit() 
2487         if (iMalloc
->Release() == 0) 
2494 bool GetSysErrMessage(int err
, wxString
& s
) 
2498         FORMAT_MESSAGE_FROM_SYSTEM
, NULL
, 
2499         err
,0, buf
, sizeof(buf
), NULL
) == 0) 
2502     buf
[sizeof(buf
) - 1] = 0; 
2507 wxString 
OLEHResultToString(HRESULT hr
) 
2509     // try formatmessage 
2511     if (GetSysErrMessage(hr
, err
)) 
2517         return wxEmptyString
; 
2519     case CONNECT_E_CANNOTCONNECT
: 
2520         return _T("Cannot connect to event interface (maybe not there ?) - see MSDN"); 
2522     case DISP_E_MEMBERNOTFOUND
: 
2523         return _T("The requested member does not exist, or the call to Invoke tried to set the value of a read-only property."); 
2525     case DISP_E_BADVARTYPE
: 
2526         return _T("One of the parameters in rgvarg is not a valid variant type."); 
2528     case DISP_E_BADPARAMCOUNT
: 
2529         return _T("The number of elements provided to DISPPARAMS is different from the number of parameters accepted by the method or property"); 
2531     case DISP_E_EXCEPTION
: 
2532         return _T("The application needs to raise an exception. In this case, the structure passed in pExcepInfo should be filled in."); 
2534     case DISP_E_TYPEMISMATCH
: 
2535         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."); 
2537     case DISP_E_PARAMNOTOPTIONAL
: 
2538         return _T("A required parameter was omitted."); 
2540     case DISP_E_PARAMNOTFOUND
: 
2541         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."); 
2543     case OLECMDERR_E_UNKNOWNGROUP
: 
2544         return _T("The pguidCmdGroup parameter is not NULL but does not specify a recognized command group."); 
2546     case OLECMDERR_E_NOTSUPPORTED
: 
2547         return _T("The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup."); 
2549     case OLECMDERR_E_DISABLED
: 
2550         return _T("The command identified by nCmdID is currently disabled and cannot be executed."); 
2552     case OLECMDERR_E_NOHELP
: 
2553         return _T("The caller has asked for help on the command identified by nCmdID, but no help is available."); 
2555     case OLECMDERR_E_CANCELED
: 
2556         return _T("The user canceled the execution of the command."); 
2559         return _T("E_INVALIDARG"); 
2562         return _T("E_OUTOFMEMORY"); 
2565         return _T("E_NOINTERFACE"); 
2568         return _T("E_UNEXPECTED"); 
2570     case STG_E_INVALIDFLAG
: 
2571         return _T("STG_E_INVALIDFLAG"); 
2574         return _T("E_FAIL"); 
2577         return _T("E_NOTIMPL"); 
2582             buf
.Printf(_T("Unknown - 0x%X"), hr
); 
2588 // borrowed from src/msw/ole/oleutils.cpp 
2589 wxString 
GetIIDName(REFIID riid
) 
2591   // an association between symbolic name and numeric value of an IID 
2595     const wxChar 
*szName
; 
2598   // construct the table containing all known interfaces 
2599   #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) } 
2600   #define ADD_KNOWN_GUID(name) { &name, _T(#name) } 
2602   static const KNOWN_IID aKnownIids
[] =  
2604     ADD_KNOWN_IID(ServiceProvider
), 
2605     ADD_KNOWN_IID(AdviseSink
), 
2606     ADD_KNOWN_IID(AdviseSink2
), 
2607     ADD_KNOWN_IID(BindCtx
), 
2608     ADD_KNOWN_IID(ClassFactory
), 
2609 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__) 
2610     ADD_KNOWN_IID(ContinueCallback
), 
2611     ADD_KNOWN_IID(EnumOleDocumentViews
), 
2612     ADD_KNOWN_IID(OleCommandTarget
), 
2613     ADD_KNOWN_IID(OleDocument
), 
2614     ADD_KNOWN_IID(OleDocumentSite
), 
2615     ADD_KNOWN_IID(OleDocumentView
), 
2616     ADD_KNOWN_IID(Print
), 
2618     ADD_KNOWN_IID(DataAdviseHolder
), 
2619     ADD_KNOWN_IID(DataObject
), 
2620     ADD_KNOWN_IID(Debug
), 
2621     ADD_KNOWN_IID(DebugStream
), 
2622     ADD_KNOWN_IID(DfReserved1
), 
2623     ADD_KNOWN_IID(DfReserved2
), 
2624     ADD_KNOWN_IID(DfReserved3
), 
2625     ADD_KNOWN_IID(Dispatch
), 
2626     ADD_KNOWN_IID(DropSource
), 
2627     ADD_KNOWN_IID(DropTarget
), 
2628     ADD_KNOWN_IID(EnumCallback
), 
2629     ADD_KNOWN_IID(EnumFORMATETC
), 
2630     ADD_KNOWN_IID(EnumGeneric
), 
2631     ADD_KNOWN_IID(EnumHolder
), 
2632     ADD_KNOWN_IID(EnumMoniker
), 
2633     ADD_KNOWN_IID(EnumOLEVERB
), 
2634     ADD_KNOWN_IID(EnumSTATDATA
), 
2635     ADD_KNOWN_IID(EnumSTATSTG
), 
2636     ADD_KNOWN_IID(EnumString
), 
2637     ADD_KNOWN_IID(EnumUnknown
), 
2638     ADD_KNOWN_IID(EnumVARIANT
), 
2639     ADD_KNOWN_IID(ExternalConnection
), 
2640     ADD_KNOWN_IID(InternalMoniker
), 
2641     ADD_KNOWN_IID(LockBytes
), 
2642     ADD_KNOWN_IID(Malloc
), 
2643     ADD_KNOWN_IID(Marshal
), 
2644     ADD_KNOWN_IID(MessageFilter
), 
2645     ADD_KNOWN_IID(Moniker
), 
2646     ADD_KNOWN_IID(OleAdviseHolder
), 
2647     ADD_KNOWN_IID(OleCache
), 
2648     ADD_KNOWN_IID(OleCache2
), 
2649     ADD_KNOWN_IID(OleCacheControl
), 
2650     ADD_KNOWN_IID(OleClientSite
), 
2651     ADD_KNOWN_IID(OleContainer
), 
2652     ADD_KNOWN_IID(OleInPlaceActiveObject
), 
2653     ADD_KNOWN_IID(OleInPlaceFrame
), 
2654     ADD_KNOWN_IID(OleInPlaceObject
), 
2655     ADD_KNOWN_IID(OleInPlaceSite
), 
2656     ADD_KNOWN_IID(OleInPlaceUIWindow
), 
2657     ADD_KNOWN_IID(OleItemContainer
), 
2658     ADD_KNOWN_IID(OleLink
), 
2659     ADD_KNOWN_IID(OleManager
), 
2660     ADD_KNOWN_IID(OleObject
), 
2661     ADD_KNOWN_IID(OlePresObj
), 
2662     ADD_KNOWN_IID(OleWindow
), 
2663     ADD_KNOWN_IID(PSFactory
), 
2664     ADD_KNOWN_IID(ParseDisplayName
), 
2665     ADD_KNOWN_IID(Persist
), 
2666     ADD_KNOWN_IID(PersistFile
), 
2667     ADD_KNOWN_IID(PersistStorage
), 
2668     ADD_KNOWN_IID(PersistStream
), 
2669     ADD_KNOWN_IID(ProxyManager
), 
2670     ADD_KNOWN_IID(RootStorage
), 
2671     ADD_KNOWN_IID(RpcChannel
), 
2672     ADD_KNOWN_IID(RpcProxy
), 
2673     ADD_KNOWN_IID(RpcStub
), 
2674     ADD_KNOWN_IID(RunnableObject
), 
2675     ADD_KNOWN_IID(RunningObjectTable
), 
2676     ADD_KNOWN_IID(StdMarshalInfo
), 
2677     ADD_KNOWN_IID(Storage
), 
2678     ADD_KNOWN_IID(Stream
), 
2679     ADD_KNOWN_IID(StubManager
), 
2680     ADD_KNOWN_IID(Unknown
), 
2681     ADD_KNOWN_IID(ViewObject
), 
2682     ADD_KNOWN_IID(ViewObject2
), 
2683     ADD_KNOWN_GUID(IID_IDispatch
), 
2684     ADD_KNOWN_GUID(IID_IWebBrowser
), 
2685     ADD_KNOWN_GUID(IID_IWebBrowserApp
), 
2686     ADD_KNOWN_GUID(IID_IWebBrowser2
), 
2687     ADD_KNOWN_GUID(IID_IWebBrowser
), 
2688     ADD_KNOWN_GUID(DIID_DWebBrowserEvents2
), 
2689     ADD_KNOWN_GUID(DIID_DWebBrowserEvents
), 
2692   // don't clobber preprocessor name space 
2693   #undef ADD_KNOWN_IID 
2694   #undef ADD_KNOWN_GUID 
2696   // try to find the interface in the table 
2697   for ( size_t ui 
= 0; ui 
< WXSIZEOF(aKnownIids
); ui
++ )  
2699     if ( riid 
== *aKnownIids
[ui
].pIid 
)  
2701       return aKnownIids
[ui
].szName
; 
2705   // unknown IID, just transform to string 
2706   LPOLESTR str 
= NULL
; 
2707   StringFromIID(riid
, &str
); 
2715       return _T("StringFromIID() error");