2 #include <wx/strconv.h> 
  13 // Depending on compilation mode, the wx headers may have undef'd 
  14 // this, but in this case we need it so the virtual method in 
  15 // FrameSite will match what is in oleidl.h. 
  18         #define GetObject GetObjectW 
  20         #define GetObject GetObjectA 
  25 ////////////////////////////////////////////////////////////////////// 
  26 BEGIN_EVENT_TABLE(wxActiveX
, wxWindow
) 
  27     EVT_SIZE(wxActiveX::OnSize
) 
  28     EVT_PAINT(wxActiveX::OnPaint
) 
  29     EVT_MOUSE_EVENTS(wxActiveX::OnMouse
) 
  30         EVT_SET_FOCUS(wxActiveX::OnSetFocus
) 
  31         EVT_KILL_FOCUS(wxActiveX::OnKillFocus
) 
  37     public IOleClientSite
, 
  38     public IOleInPlaceSiteEx
, 
  39     public IOleInPlaceFrame
, 
  40     public IOleItemContainer
, 
  42     public IOleCommandTarget
, 
  43     public IOleDocumentSite
, 
  45     public IOleControlSite
 
  48     DECLARE_OLE_UNKNOWN(FrameSite
); 
  51         FrameSite(wxActiveX 
* win
); 
  55         STDMETHODIMP 
GetWindow(HWND
*); 
  56         STDMETHODIMP 
ContextSensitiveHelp(BOOL
); 
  59         STDMETHODIMP 
GetBorder(LPRECT
); 
  60         STDMETHODIMP 
RequestBorderSpace(LPCBORDERWIDTHS
); 
  61         STDMETHODIMP 
SetBorderSpace(LPCBORDERWIDTHS
); 
  62         STDMETHODIMP 
SetActiveObject(IOleInPlaceActiveObject
*, LPCOLESTR
); 
  65         STDMETHODIMP 
InsertMenus(HMENU
, LPOLEMENUGROUPWIDTHS
); 
  66         STDMETHODIMP 
SetMenu(HMENU
, HOLEMENU
, HWND
); 
  67         STDMETHODIMP 
RemoveMenus(HMENU
); 
  68         STDMETHODIMP 
SetStatusText(LPCOLESTR
); 
  69         STDMETHODIMP 
EnableModeless(BOOL
); 
  70         STDMETHODIMP 
TranslateAccelerator(LPMSG
, WORD
); 
  73         STDMETHODIMP 
CanInPlaceActivate(); 
  74         STDMETHODIMP 
OnInPlaceActivate(); 
  75         STDMETHODIMP 
OnUIActivate(); 
  76         STDMETHODIMP 
GetWindowContext(IOleInPlaceFrame
**, IOleInPlaceUIWindow
**, 
  77                 LPRECT
, LPRECT
, LPOLEINPLACEFRAMEINFO
); 
  78         STDMETHODIMP 
Scroll(SIZE
); 
  79         STDMETHODIMP 
OnUIDeactivate(BOOL
); 
  80         STDMETHODIMP 
OnInPlaceDeactivate(); 
  81         STDMETHODIMP 
DiscardUndoState(); 
  82         STDMETHODIMP 
DeactivateAndUndo(); 
  83         STDMETHODIMP 
OnPosRectChange(LPCRECT
); 
  86         STDMETHODIMP 
OnInPlaceActivateEx(BOOL
*, DWORD
); 
  87         STDMETHODIMP 
OnInPlaceDeactivateEx(BOOL
); 
  88         STDMETHODIMP 
RequestUIActivate(); 
  91         STDMETHODIMP 
SaveObject(); 
  92         STDMETHODIMP 
GetMoniker(DWORD
, DWORD
, IMoniker
**); 
  93         STDMETHODIMP 
GetContainer(LPOLECONTAINER FAR
*); 
  94         STDMETHODIMP 
ShowObject(); 
  95         STDMETHODIMP 
OnShowWindow(BOOL
); 
  96         STDMETHODIMP 
RequestNewObjectLayout(); 
  99         STDMETHODIMP 
OnControlInfoChanged(); 
 100         STDMETHODIMP 
LockInPlaceActive(BOOL
); 
 101         STDMETHODIMP 
GetExtendedControl(IDispatch
**); 
 102         STDMETHODIMP 
TransformCoords(POINTL
*, POINTF
*, DWORD
); 
 103         STDMETHODIMP 
TranslateAccelerator(LPMSG
, DWORD
); 
 104         STDMETHODIMP 
OnFocus(BOOL
); 
 105         STDMETHODIMP 
ShowPropertyFrame(); 
 108         STDMETHODIMP 
QueryStatus(const GUID
*, ULONG
, OLECMD
[], OLECMDTEXT
*); 
 109         STDMETHODIMP 
Exec(const GUID
*, DWORD
, DWORD
, VARIANTARG
*, VARIANTARG
*); 
 112         STDMETHODIMP 
ParseDisplayName(IBindCtx
*, LPOLESTR
, ULONG
*, IMoniker
**); 
 115         STDMETHODIMP 
EnumObjects(DWORD
, IEnumUnknown
**); 
 116         STDMETHODIMP 
LockContainer(BOOL
); 
 119         STDMETHODIMP 
GetObject(LPOLESTR
, DWORD
, IBindCtx
*, REFIID
, void**); 
 120         STDMETHODIMP 
GetObjectStorage(LPOLESTR
, IBindCtx
*, REFIID
, void**); 
 121         STDMETHODIMP 
IsRunning(LPOLESTR
); 
 124         STDMETHODIMP 
GetIDsOfNames(REFIID
, OLECHAR
**, unsigned int, LCID
, DISPID
*); 
 125         STDMETHODIMP 
GetTypeInfo(unsigned int, LCID
, ITypeInfo
**); 
 126         STDMETHODIMP 
GetTypeInfoCount(unsigned int*); 
 127         STDMETHODIMP 
Invoke(DISPID
, REFIID
, LCID
, WORD
, DISPPARAMS
*, VARIANT
*, EXCEPINFO
*, UINT
*); 
 130         void STDMETHODCALLTYPE 
OnDataChange(FORMATETC
*, STGMEDIUM
*); 
 131         void STDMETHODCALLTYPE 
OnViewChange(DWORD
, LONG
); 
 132         void STDMETHODCALLTYPE 
OnRename(IMoniker
*); 
 133         void STDMETHODCALLTYPE 
OnSave(); 
 134         void STDMETHODCALLTYPE 
OnClose(); 
 137         HRESULT STDMETHODCALLTYPE 
ActivateMe(IOleDocumentView __RPC_FAR 
*pViewToActivate
); 
 141         wxActiveX 
* m_window
; 
 146         bool m_bSupportsWindowlessActivation
; 
 147         bool m_bInPlaceLocked
; 
 148         bool m_bInPlaceActive
; 
 154         LCID m_nAmbientLocale
; 
 155         COLORREF m_clrAmbientForeColor
; 
 156         COLORREF m_clrAmbientBackColor
; 
 157         bool m_bAmbientShowHatching
; 
 158         bool m_bAmbientShowGrabHandles
; 
 159         bool m_bAmbientAppearance
; 
 162 DEFINE_OLE_TABLE(FrameSite
) 
 163     OLE_INTERFACE(IID_IUnknown
, IOleClientSite
) 
 165     OLE_IINTERFACE(IOleClientSite
) 
 167     OLE_INTERFACE(IID_IOleWindow
, IOleInPlaceSite
) 
 168     OLE_IINTERFACE(IOleInPlaceSite
) 
 169     OLE_IINTERFACE(IOleInPlaceSiteEx
) 
 171     //OLE_IINTERFACE(IOleWindow) 
 172     OLE_IINTERFACE(IOleInPlaceUIWindow
) 
 173     OLE_IINTERFACE(IOleInPlaceFrame
) 
 175     OLE_IINTERFACE(IParseDisplayName
) 
 176     OLE_IINTERFACE(IOleContainer
) 
 177     OLE_IINTERFACE(IOleItemContainer
) 
 179     OLE_IINTERFACE(IDispatch
) 
 181     OLE_IINTERFACE(IOleCommandTarget
) 
 183     OLE_IINTERFACE(IOleDocumentSite
) 
 185     OLE_IINTERFACE(IAdviseSink
) 
 187     OLE_IINTERFACE(IOleControlSite
) 
 191 wxActiveX::wxActiveX(wxWindow 
* parent
, REFCLSID clsid
, wxWindowID id
, 
 195         const wxString
& name
) : 
 196 wxWindow(parent
, id
, pos
, size
, style
, name
) 
 198     m_bAmbientUserMode 
= true; 
 199     m_docAdviseCookie 
= 0; 
 200     CreateActiveX(clsid
); 
 203 wxActiveX::wxActiveX(wxWindow 
* parent
, wxString progId
, wxWindowID id
, 
 207         const wxString
& name
) : 
 208     wxWindow(parent
, id
, pos
, size
, style
, name
) 
 210     m_bAmbientUserMode 
= true; 
 211     m_docAdviseCookie 
= 0; 
 212     CreateActiveX((LPOLESTR
) (const wchar_t *) progId
.wc_str(wxConvUTF8
)); 
 215 wxActiveX::~wxActiveX() 
 217         // disconnect connection points 
 218         wxOleConnectionArray::iterator it 
= m_connections
.begin(); 
 219         while (it 
!= m_connections
.end()) 
 221                 wxOleConnectionPoint
& cp 
= it
->first
; 
 222                 cp
->Unadvise(it
->second
); 
 226         m_connections
.clear(); 
 228     if (m_oleInPlaceObject
.Ok()) 
 230                 m_oleInPlaceObject
->InPlaceDeactivate(); 
 231                 m_oleInPlaceObject
->UIDeactivate(); 
 235         if (m_oleObject
.Ok()) 
 237             if (m_docAdviseCookie 
!= 0) 
 238                 m_oleObject
->Unadvise(m_docAdviseCookie
); 
 240             m_oleObject
->DoVerb(OLEIVERB_HIDE
, NULL
, m_clientSite
, 0, (HWND
) GetHWND(), NULL
); 
 241         m_oleObject
->Close(OLECLOSE_NOSAVE
); 
 242                 m_oleObject
->SetClientSite(NULL
); 
 246 void wxActiveX::CreateActiveX(REFCLSID clsid
) 
 252     //////////////////////////////////////////////////////// 
 254     FrameSite 
*frame 
= new FrameSite(this); 
 256     hret 
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch 
*) frame
); 
 257     wxASSERT(SUCCEEDED(hret
)); 
 259     wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch 
*) frame
); 
 260     wxASSERT(adviseSink
.Ok()); 
 263         // // Create Object, get IUnknown interface 
 264     m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
); 
 265         wxASSERT(m_ActiveX
.Ok()); 
 270         // Get IOleObject interface 
 271         hret 
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
); 
 272         wxASSERT(SUCCEEDED(hret
)); 
 274     // get IViewObject Interface 
 275     hret 
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
); 
 276         wxASSERT(SUCCEEDED(hret
)); 
 279     m_docAdviseCookie 
= 0; 
 280     hret 
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
); 
 281     WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")"); 
 282     m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
); 
 283         OleSetContainedObject(m_oleObject
, TRUE
); 
 287     // Get IOleInPlaceObject interface 
 288         hret 
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
); 
 289         wxASSERT(SUCCEEDED(hret
)); 
 293         m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
); 
 294     wxASSERT(SUCCEEDED(hret
)); 
 296     // set client site first ? 
 297     if (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
) 
 298                 m_oleObject
->SetClientSite(m_clientSite
); 
 302     wxAutoOleInterface
<IPersistStreamInit
> 
 303                 pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
); 
 305     if (pPersistStreamInit
.Ok()) 
 307         hret 
= pPersistStreamInit
->InitNew(); 
 308         WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()"); 
 311     if (! (dwMiscStatus 
& OLEMISC_SETCLIENTSITEFIRST
)) 
 312                 m_oleObject
->SetClientSite(m_clientSite
); 
 316         GetClientSize(&w
, &h
); 
 325     if (m_oleInPlaceObject
.Ok()) 
 327         hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 328             WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 330                 ::SetActiveWindow(m_oleObjectHWND
); 
 334     if (! (dwMiscStatus 
& OLEMISC_INVISIBLEATRUNTIME
)) 
 336                 if (w 
> 0 && h 
> 0 && m_oleInPlaceObject
.Ok()) 
 337                         m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
 339                 hret 
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 340         hret 
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
); 
 343         if (! m_oleObjectHWND 
&& m_oleInPlaceObject
.Ok()) 
 345                 hret 
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
); 
 346                 WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)"); 
 351                 ::SetActiveWindow(m_oleObjectHWND
); 
 352                 ::ShowWindow(m_oleObjectHWND
, SW_SHOW
); 
 356 void wxActiveX::CreateActiveX(LPOLESTR progId
) 
 359     if (CLSIDFromProgID(progId
, &clsid
) != S_OK
) 
 362     CreateActiveX(clsid
); 
 365 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 366 // Case Insensitive Map of Event names to eventTypes 
 367 // created dynamically at run time in: 
 368 //      EVT_ACTIVEX(eventName, id, fn) 
 369 // we map the pointer to them so that: 
 370 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 371 // can return a const reference, which is neccessary for event tables 
 372 // probably should use a wxWindows hash table here, but I'm lazy ... 
 373 struct less_wxStringI
 
 375     bool operator()(const wxString
& x
, const wxString
& y
) const 
 377         return x
.CmpNoCase(y
) < 0; 
 381 typedef map
<wxString
, wxEventType 
*, less_wxStringI
> ActiveXNamedEventMap
; 
 382 static ActiveXNamedEventMap sg_NamedEventMap
; 
 384 const wxEventType
& RegisterActiveXEvent(const wxChar 
*eventName
) 
 386     wxString ev 
= eventName
; 
 387     ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.find(ev
); 
 388     if (it 
== sg_NamedEventMap
.end()) 
 390         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 391         sg_NamedEventMap
[ev
] = et
; 
 396     return *(it
->second
); 
 400 //////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 401 // Map of Event DISPID's to eventTypes 
 402 // created dynamically at run time in: 
 403 //      EVT_ACTIVEX(eventName, id, fn) 
 404 // we map the pointer to them so that: 
 405 //      const wxEventType& RegisterActiveXEvent(wxString eventName); 
 406 // can return a const reference, which is neccessary for event tables 
 408 typedef map
<DISPID
, wxEventType 
*> ActiveXDISPIDEventMap
; 
 409 static ActiveXDISPIDEventMap sg_dispIdEventMap
; 
 411 const wxEventType
& RegisterActiveXEvent(DISPID event
) 
 413     ActiveXDISPIDEventMap::iterator it 
= sg_dispIdEventMap
.find(event
); 
 414     if (it 
== sg_dispIdEventMap
.end()) 
 416         wxEventType  
*et 
= new wxEventType(wxNewEventType()); 
 417         sg_dispIdEventMap
[event
] = et
; 
 422     return *(it
->second
); 
 425 // one off class for automatic freeing of activeX eventtypes 
 426 class ActiveXEventMapFlusher
 
 429     ~ActiveXEventMapFlusher() 
 432         ActiveXNamedEventMap::iterator it 
= sg_NamedEventMap
.end(); 
 433         while (it 
!= sg_NamedEventMap
.end()) 
 440         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.end(); 
 441         while (dit 
!= sg_dispIdEventMap
.end()) 
 449 static ActiveXEventMapFlusher s_dummyActiveXEventMapFlusher
; 
 452 ////////////////////////////////////////////////////// 
 453 bool MSWVariantToVariant(VARIANTARG
& va
, wxVariant
& vx
) 
 457         case VT_VARIANT 
| VT_BYREF
: 
 458                 return MSWVariantToVariant(*va
.pvarVal
, vx
); 
 465     case VT_I2 
| VT_BYREF
: 
 466     case VT_I4 
| VT_BYREF
: 
 467         vx 
= (long) *va
.piVal
; 
 471         vx 
= wxString(va
.bstrVal
); 
 474     case VT_BSTR 
| VT_BYREF
: 
 475         vx 
= wxString(*va
.pbstrVal
); 
 479                 vx 
= (va
.boolVal 
!= FALSE
); 
 482         case VT_BOOL 
| VT_BYREF
: 
 483                 vx 
= (*va
.pboolVal 
!= FALSE
); 
 492 bool VariantToMSWVariant(wxVariant
& vx
, VARIANTARG
& va
) 
 496         case VT_VARIANT 
| VT_BYREF
: 
 497                 return VariantToMSWVariant(vx
, va
); 
 504     case VT_I2 
| VT_BYREF
: 
 505     case VT_I4 
| VT_BYREF
: 
 506          *va
.piVal 
= (long) vx
; 
 510                 va
.boolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 513         case VT_BOOL 
| VT_BYREF
: 
 514                 *va
.pboolVal 
= ((bool) vx
) ? TRUE 
: FALSE
; 
 522 class wxActiveXEvents 
: public IDispatch
 
 525     DECLARE_OLE_UNKNOWN(wxActiveXEvents
); 
 528     wxActiveX 
*m_activeX
; 
 531     wxActiveXEvents(wxActiveX 
*ax
) : m_activeX(ax
) {} 
 532         virtual ~wxActiveXEvents() 
 537         STDMETHODIMP 
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
) 
 542         STDMETHODIMP 
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
) 
 547         STDMETHODIMP 
GetTypeInfoCount(unsigned int* i
) 
 553     void DispatchEvent(int eventIdx
, const wxEventType
& eventType
, DISPPARAMS 
* pDispParams
) 
 555         wxASSERT(eventIdx 
>= 0 && eventIdx 
< int(m_activeX
->m_events
.size())); 
 556         wxActiveX::FuncX 
&func 
= m_activeX
->m_events
[eventIdx
]; 
 558                 wxActiveXEvent  event
; 
 559         event
.SetId(m_activeX
->GetId()); 
 560             event
.SetEventType(eventType
); 
 561         event
.m_params
.NullList(); 
 562         event
.m_params
.SetName(func
.name
); 
 568             // sometimes the pDispParams does not match the param info for a activex control 
 569             int nArg 
= wxMin(func
.params
.size(), pDispParams
->cArgs
); 
 570             for (int i 
= nArg 
- 1; i 
>= 0; i
--) 
 572                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 573                                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 577                 MSWVariantToVariant(va
, vx
); 
 578                 event
.m_params
.Append(vx
); 
 584             int nArg 
= wxMin(func
.params
.size(), pDispParams
->cArgs
); 
 585                 m_activeX
->GetParent()->ProcessEvent(event
); 
 586             for (int i 
= 0; i 
< nArg
; i
++) 
 588                 VARIANTARG
& va 
= pDispParams
->rgvarg
[i
]; 
 589                                 wxActiveX::ParamX 
&px 
= func
.params
[nArg 
- i 
- 1]; 
 593                                         wxVariant
& vx 
= event
.m_params
[nArg 
- i 
- 1]; 
 595                                         VariantToMSWVariant(vx
, va
); 
 600                 m_activeX
->GetParent()->AddPendingEvent(event
); 
 604         STDMETHODIMP 
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
 605                                                   WORD wFlags
, DISPPARAMS 
* pDispParams
, 
 606                                                   VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
 607                                                   unsigned int * puArgErr
) 
 609             if (wFlags 
& (DISPATCH_PROPERTYGET 
| DISPATCH_PROPERTYPUT 
| DISPATCH_PROPERTYPUTREF
)) 
 614         // map dispid to m_eventsIdx 
 615         wxActiveX::MemberIdList::iterator mid 
= m_activeX
->m_eventsIdx
.find((MEMBERID
) dispIdMember
); 
 616         if (mid 
== m_activeX
->m_eventsIdx
.end()) 
 619         int funcIdx 
= mid
->second
; 
 620         wxActiveX::FuncX 
&func 
= m_activeX
->m_events
[funcIdx
]; 
 623         // try to find dispid event 
 624         ActiveXDISPIDEventMap::iterator dit 
= sg_dispIdEventMap
.find(dispIdMember
); 
 625         if (dit 
!= sg_dispIdEventMap
.end()) 
 628             DispatchEvent(funcIdx
, *(dit
->second
), pDispParams
); 
 633         ActiveXNamedEventMap::iterator nit 
= sg_NamedEventMap
.find(func
.name
); 
 634         if (nit 
== sg_NamedEventMap
.end()) 
 638         DispatchEvent(funcIdx
, *(nit
->second
), pDispParams
); 
 644 DEFINE_OLE_TABLE(wxActiveXEvents
) 
 645         OLE_IINTERFACE(IUnknown
) 
 646         OLE_INTERFACE(IID_IDispatch
, IDispatch
) 
 649 wxString 
wxActiveXEvent::EventName() 
 651     return m_params
.GetName(); 
 654 int wxActiveXEvent::ParamCount() const 
 656     return m_params
.GetCount(); 
 659 wxString 
wxActiveXEvent::ParamType(int idx
) 
 661     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
 663     return m_params
[idx
].GetType(); 
 666 wxString 
wxActiveXEvent::ParamName(int idx
) 
 668     wxASSERT(idx 
>= 0 && idx 
< m_params
.GetCount()); 
 670     return m_params
[idx
].GetName(); 
 673 static wxVariant nullVar
; 
 675 wxVariant 
wxActiveXEvent::operator[] (int idx
) const 
 677     return (wxVariant
&) operator[] (idx
); 
 680 wxVariant
& wxActiveXEvent::operator[] (int idx
) 
 682     wxASSERT(idx 
>= 0 && idx 
< ParamCount()); 
 684     return m_params
[idx
]; 
 687 wxVariant 
wxActiveXEvent::operator[] (wxString name
) const 
 689     return (wxVariant
&) operator[] (name
); 
 692 wxVariant
& wxActiveXEvent::operator[] (wxString name
) 
 694     for (int i 
= 0; i 
< m_params
.GetCount(); i
++) 
 696         if (name
.CmpNoCase(m_params
[i
].GetName()) == 0) 
 700     wxString err 
= wxT("wxActiveXEvent::operator[] invalid name <") + name 
+ wxT(">"); 
 701     err 
+= wxT("\r\nValid Names = :\r\n"); 
 702     for (i 
= 0; i 
< m_params
.GetCount(); i
++) 
 704         err 
+= m_params
[i
].GetName(); 
 708     wxASSERT_MSG(false, err
); 
 713 void wxActiveX::GetTypeInfo() 
 716         We are currently only interested in the IDispatch interface 
 717         to the control. For dual interfaces (TypeKind = TKIND_INTERFACE) 
 718         we should drill down through the inheritance 
 719         (using TYPEATTR->cImplTypes) and GetRefTypeOfImplType(n) 
 720         and retrieve all the func names etc that way, then generate a C++ 
 723         But we don't do this and probably never will, so if we have a DUAL 
 724         interface then we query for the IDispatch 
 725         via GetRefTypeOfImplType(-1). 
 730         // get type info via class info 
 731         wxAutoOleInterface
<IProvideClassInfo
> classInfo(IID_IProvideClassInfo
, m_ActiveX
); 
 732         if (! classInfo
.Ok()) 
 736         wxAutoOleInterface
<ITypeInfo
> typeInfo
; 
 737         hret 
= classInfo
->GetClassInfo(typeInfo
.GetRef()); 
 743         hret 
= typeInfo
->GetTypeAttr(&ta
); 
 747     // this should be a TKIND_COCLASS 
 748     wxASSERT(ta
->typekind 
== TKIND_COCLASS
); 
 750     // iterate contained interfaces 
 751         for (int i 
= 0; i 
< ta
->cImplTypes
; i
++) 
 755                 // get dispatch type info handle 
 756                 hret 
= typeInfo
->GetRefTypeOfImplType(i
, &rt
); 
 757                 if (! SUCCEEDED(hret
)) 
 760                 // get dispatch type info interface 
 761                 wxAutoOleInterface
<ITypeInfo
>  ti
; 
 762                 hret 
= typeInfo
->GetRefTypeInfo(rt
, ti
.GetRef()); 
 766         // check if default event sink 
 767         bool defEventSink 
= false; 
 768         int impTypeFlags 
= 0; 
 769         typeInfo
->GetImplTypeFlags(i
, &impTypeFlags
); 
 771         if (impTypeFlags 
& IMPLTYPEFLAG_FDEFAULT
) 
 773             if (impTypeFlags 
& IMPLTYPEFLAG_FSOURCE
) 
 775                 WXOLE_TRACEOUT(wxT("Default Event Sink")); 
 780                 WXOLE_TRACEOUT(wxT("Default Interface")); 
 786                 GetTypeInfo(ti
, defEventSink
); 
 791     typeInfo
->ReleaseTypeAttr(ta
); 
 794 void wxActiveX::GetTypeInfo(ITypeInfo 
*ti
, bool defEventSink
) 
 797         wxAutoOleInterface
<ITypeInfo
> typeInfo(ti
); 
 801         HRESULT hret 
= typeInfo
->GetTypeAttr(&ta
); 
 805         if (ta
->typekind 
== TKIND_DISPATCH
) 
 807         WXOLE_TRACEOUT(wxT("GUID = ") << GetIIDName(ta
->guid
).c_str()); 
 811             wxActiveXEvents 
*disp 
= new wxActiveXEvents(this); 
 812             ConnectAdvise(ta
->guid
, disp
); 
 816                 // Get Function Names 
 817                 for (int i 
= 0; i 
< ta
->cFuncs
; i
++) 
 819                         FUNCDESC FAR 
*fd 
= NULL
; 
 821                         hret 
= typeInfo
->GetFuncDesc(i
, &fd
); 
 825                         BSTR anames
[1] = {NULL
}; 
 828                         hret 
= typeInfo
->GetNames(fd
->memid
, anames
, 1, &n
); 
 832                                 wxString name 
= anames
[0]; 
 834                                 WXOLE_TRACEOUT(wxT("Name ") << i 
<< wxT(" = ") << name
.c_str()); 
 835                                 SysFreeString(anames
[0]); 
 841                     func
.memid 
= fd
->memid
; 
 845                     unsigned int maxPNames 
= fd
->cParams 
+ 1; 
 846                     unsigned int nPNames 
= 0; 
 847                     BSTR 
*pnames 
= new BSTR
[maxPNames
]; 
 849                     hret 
= typeInfo
->GetNames(fd
->memid
, pnames
, maxPNames
, &nPNames
); 
 850                     wxASSERT(int(nPNames
) >= fd
->cParams 
+ 1); 
 852                     SysFreeString(pnames
[0]); 
 854                                         for (int p 
= 0; p 
< fd
->cParams
; p
++) 
 858                                                 param
.flags 
= fd
->lprgelemdescParam
[p
].idldesc
.wIDLFlags
; 
 859                                                 param
.vt 
= fd
->lprgelemdescParam
[p
].tdesc
.vt
; 
 860                         param
.isPtr 
= (param
.vt 
== VT_PTR
); 
 861                         param
.isSafeArray 
= (param
.vt 
== VT_SAFEARRAY
); 
 862                         if (param
.isPtr 
|| param
.isSafeArray
) 
 863                             param
.vt 
= fd
->lprgelemdescParam
[p
].tdesc
.lptdesc
->vt
; 
 865                         param
.name 
= pnames
[p 
+ 1]; 
 866                         SysFreeString(pnames
[p 
+ 1]); 
 868                                                 func
.hasOut 
|= (param
.IsOut() || param
.isPtr
); 
 869                                                 func
.params
.push_back(param
); 
 873                     m_events
.push_back(func
); 
 874                     m_eventsIdx
[fd
->memid
] = m_events
.size() - 1; 
 878                         typeInfo
->ReleaseFuncDesc(fd
); 
 882         typeInfo
->ReleaseTypeAttr(ta
); 
 885 /////////////////////////////////////////////// 
 886 // Type Info exposure 
 887 const wxActiveX::FuncX
& wxActiveX::GetEvent(int idx
) const 
 889     wxASSERT(idx 
>= 0 && idx 
< GetEventCount()); 
 891     return m_events
[idx
]; 
 894 /////////////////////////////////////////////// 
 896 HRESULT 
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown 
*events
) 
 898         wxOleConnectionPoint    cp
; 
 899         DWORD                                   adviseCookie 
= 0; 
 901         wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
); 
 902         if (! cpContainer
.Ok()) 
 905         HRESULT hret 
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef()); 
 906         if (! SUCCEEDED(hret
)) 
 909         hret 
= cp
->Advise(events
, &adviseCookie
); 
 912                 m_connections
.push_back(wxOleConnection(cp
, adviseCookie
)); 
 917 HRESULT 
wxActiveX::AmbientPropertyChanged(DISPID dispid
) 
 919     wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
); 
 922         return oleControl
->OnAmbientPropertyChange(dispid
); 
 927 #define HIMETRIC_PER_INCH   2540 
 928 #define MAP_PIX_TO_LOGHIM(x,ppli)   MulDiv(HIMETRIC_PER_INCH, (x), (ppli)) 
 930 static void PixelsToHimetric(SIZEL 
&sz
) 
 938                 HDC dc 
= GetDC(NULL
); 
 939                 logX 
= GetDeviceCaps(dc
, LOGPIXELSX
); 
 940                 logY 
= GetDeviceCaps(dc
, LOGPIXELSY
); 
 944 #define HIMETRIC_INCH   2540 
 945 #define CONVERT(x, logpixels)   MulDiv(HIMETRIC_INCH, (x), (logpixels)) 
 947         sz
.cx 
= CONVERT(sz
.cx
, logX
); 
 948         sz
.cy 
= CONVERT(sz
.cy
, logY
); 
 955 void wxActiveX::OnSize(wxSizeEvent
& event
) 
 958         GetClientSize(&w
, &h
); 
 966         if (w 
<= 0 && h 
<= 0) 
 969         // extents are in HIMETRIC units 
 970     if (m_oleObject
.Ok()) 
 973             PixelsToHimetric(sz
); 
 977         m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
); 
 978         if (sz2
.cx 
!=  sz
.cx 
|| sz
.cy 
!= sz2
.cy
) 
 979             m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
); 
 982     if (m_oleInPlaceObject
.Ok()) 
 983                 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
); 
 986 void wxActiveX::OnPaint(wxPaintEvent
& event
) 
 988 //      wxLogTrace(wxT("repainting activex win")); 
 999         // Draw only when control is windowless or deactivated 
1002                 ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
); 
1004                         RECTL 
*prcBounds 
= (RECTL 
*) &posRect
; 
1005                         m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
, 
1006                                 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0); 
1011                 dc
.SetBrush(*wxRED_BRUSH
); 
1012                 dc
.DrawRectangle(0, 0, w
, h
); 
1013                 dc
.SetBrush(wxNullBrush
); 
1019 void wxActiveX::OnMouse(wxMouseEvent
& event
) 
1021         if (m_oleObjectHWND 
== NULL
) 
1023 //        wxLogTrace(wxT("no oleInPlaceObject")); 
1028 //      wxLogTrace(wxT("mouse event")); 
1032         LRESULT lResult 
= 0; 
1034         if (event
.m_metaDown
) 
1035         wParam 
|= MK_CONTROL
; 
1036         if (event
.m_shiftDown
) 
1038         if (event
.m_leftDown
) 
1039         wParam 
|= MK_LBUTTON
; 
1040         if (event
.m_middleDown
) 
1041         wParam 
|= MK_MBUTTON
; 
1042         if (event
.m_rightDown
) 
1043         wParam 
|= MK_RBUTTON
; 
1044         lParam 
= event
.m_x 
<< 16; 
1045         lParam 
|= event
.m_y
; 
1047         if (event
.LeftDown()) 
1048         msg 
= WM_LBUTTONDOWN
; 
1049         else if (event
.LeftDClick()) 
1050         msg 
= WM_LBUTTONDBLCLK
; 
1051         else if (event
.LeftUp()) 
1053         else if (event
.MiddleDown()) 
1054         msg 
= WM_MBUTTONDOWN
; 
1055         else if (event
.MiddleDClick()) 
1056         msg 
= WM_MBUTTONDBLCLK
; 
1057         else if (event
.MiddleUp()) 
1059         else if (event
.RightDown()) 
1060         msg 
= WM_RBUTTONDOWN
; 
1061         else if (event
.RightDClick()) 
1062         msg 
= WM_RBUTTONDBLCLK
; 
1063         else if (event
.RightUp()) 
1065         else if (event
.Moving() || event
.Dragging()) 
1071 //        wxLogTrace(wxT("no message")); 
1072         event
.Skip(); return; 
1075         if (!::SendMessage(m_oleObjectHWND
, msg
, wParam
, lParam
)) 
1077 //        wxLogTrace(wxT("msg not delivered")); 
1082 //      wxLogTrace(wxT("msg sent")); 
1085 WXLRESULT 
wxActiveX::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
) 
1087         if (m_oleObjectHWND 
== NULL
) 
1088         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1097     case WM_SYSDEADCHAR
: 
1100         PostMessage(m_oleObjectHWND
, nMsg
, wParam
, lParam
); 
1103         return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
); 
1107 void wxActiveX::OnSetFocus(wxFocusEvent
& event
) 
1109         if (m_oleInPlaceActiveObject
.Ok()) 
1110         m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
); 
1113 void wxActiveX::OnKillFocus(wxFocusEvent
& event
) 
1115         if (m_oleInPlaceActiveObject
.Ok()) 
1116         m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
); 
1120 FrameSite::FrameSite(wxActiveX 
* win
) 
1123         m_bSupportsWindowlessActivation 
= true; 
1124         m_bInPlaceLocked 
= false; 
1125         m_bUIActive 
= false; 
1126         m_bInPlaceActive 
= false; 
1127         m_bWindowless 
= false; 
1129         m_nAmbientLocale 
= 0; 
1130         m_clrAmbientForeColor 
= ::GetSysColor(COLOR_WINDOWTEXT
); 
1131         m_clrAmbientBackColor 
= ::GetSysColor(COLOR_WINDOW
); 
1132         m_bAmbientShowHatching 
= true; 
1133         m_bAmbientShowGrabHandles 
= true; 
1134         m_bAmbientAppearance 
= true; 
1137         m_hWndParent 
= (HWND
)m_window
->GetHWND(); 
1140 FrameSite::~FrameSite() 
1147 HRESULT 
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR 
** rgszNames
, unsigned int cNames
, 
1148                                                                  LCID lcid
, DISPID 
* rgDispId
) 
1150         WXOLE_TRACE("IDispatch::GetIDsOfNames"); 
1154 HRESULT 
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo 
** ppTInfo
) 
1156         WXOLE_TRACE("IDispatch::GetTypeInfo"); 
1160 HRESULT 
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
) 
1162         WXOLE_TRACE("IDispatch::GetTypeInfoCount"); 
1166 HRESULT 
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, 
1167                                                   WORD wFlags
, DISPPARAMS 
* pDispParams
, 
1168                                                   VARIANT 
* pVarResult
, EXCEPINFO 
* pExcepInfo
, 
1169                                                   unsigned int * puArgErr
) 
1171         WXOLE_TRACE("IDispatch::Invoke"); 
1173         if (!(wFlags 
& DISPATCH_PROPERTYGET
)) 
1178         if (pVarResult 
== NULL
) 
1179                 return E_INVALIDARG
; 
1181     //The most common case is boolean, use as an initial type 
1182     V_VT(pVarResult
) = VT_BOOL
; 
1184         switch (dispIdMember
) 
1186         case DISPID_AMBIENT_MESSAGEREFLECT
: 
1187             WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT"); 
1188             V_BOOL(pVarResult
)= FALSE
; 
1191         case DISPID_AMBIENT_DISPLAYASDEFAULT
: 
1192             WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT"); 
1193             V_BOOL(pVarResult
)= TRUE
; 
1196         case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
: 
1197             WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED"); 
1198             V_BOOL(pVarResult
) = TRUE
; 
1202         case DISPID_AMBIENT_SILENT
: 
1203             WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT"); 
1204             V_BOOL(pVarResult
)= TRUE
; 
1207                 case DISPID_AMBIENT_APPEARANCE
: 
1208                         pVarResult
->vt 
= VT_BOOL
; 
1209                         pVarResult
->boolVal 
= m_bAmbientAppearance
; 
1212                 case DISPID_AMBIENT_FORECOLOR
: 
1213                         pVarResult
->vt 
= VT_I4
; 
1214                         pVarResult
->lVal 
= (long) m_clrAmbientForeColor
; 
1217                 case DISPID_AMBIENT_BACKCOLOR
: 
1218                         pVarResult
->vt 
= VT_I4
; 
1219                         pVarResult
->lVal 
= (long) m_clrAmbientBackColor
; 
1222                 case DISPID_AMBIENT_LOCALEID
: 
1223                         pVarResult
->vt 
= VT_I4
; 
1224                         pVarResult
->lVal 
= (long) m_nAmbientLocale
; 
1227                 case DISPID_AMBIENT_USERMODE
: 
1228                         pVarResult
->vt 
= VT_BOOL
; 
1229                         pVarResult
->boolVal 
= m_window
->m_bAmbientUserMode
; 
1232                 case DISPID_AMBIENT_SHOWGRABHANDLES
: 
1233                         pVarResult
->vt 
= VT_BOOL
; 
1234                         pVarResult
->boolVal 
= m_bAmbientShowGrabHandles
; 
1237                 case DISPID_AMBIENT_SHOWHATCHING
: 
1238                         pVarResult
->vt 
= VT_BOOL
; 
1239                         pVarResult
->boolVal 
= m_bAmbientShowHatching
; 
1243                         return DISP_E_MEMBERNOTFOUND
; 
1251 HRESULT 
FrameSite::GetWindow(HWND 
* phwnd
) 
1253         WXOLE_TRACE("IOleWindow::GetWindow"); 
1255         return E_INVALIDARG
; 
1256         (*phwnd
) = m_hWndParent
; 
1260 HRESULT 
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
) 
1262         WXOLE_TRACE("IOleWindow::ContextSensitiveHelp"); 
1266 //IOleInPlaceUIWindow 
1268 HRESULT 
FrameSite::GetBorder(LPRECT lprectBorder
) 
1270         WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder"); 
1271         if (lprectBorder 
== NULL
) 
1272         return E_INVALIDARG
; 
1273         return INPLACE_E_NOTOOLSPACE
; 
1276 HRESULT 
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
1278         WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace"); 
1279         if (pborderwidths 
== NULL
) 
1280         return E_INVALIDARG
; 
1281         return INPLACE_E_NOTOOLSPACE
; 
1284 HRESULT 
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
) 
1286         WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace"); 
1290 HRESULT 
FrameSite::SetActiveObject(IOleInPlaceActiveObject 
*pActiveObject
, LPCOLESTR pszObjName
) 
1292         WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject"); 
1295         pActiveObject
->AddRef(); 
1297     m_window
->m_oleInPlaceActiveObject 
= pActiveObject
; 
1303 HRESULT 
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
) 
1305         WXOLE_TRACE("IOleInPlaceFrame::InsertMenus"); 
1309 HRESULT 
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
) 
1311         WXOLE_TRACE("IOleInPlaceFrame::SetMenu"); 
1315 HRESULT 
FrameSite::RemoveMenus(HMENU hmenuShared
) 
1317         WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus"); 
1321 HRESULT 
FrameSite::SetStatusText(LPCOLESTR pszStatusText
) 
1323         WXOLE_TRACE("IOleInPlaceFrame::SetStatusText"); 
1324         //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText); 
1328 HRESULT 
FrameSite::EnableModeless(BOOL fEnable
) 
1330         WXOLE_TRACE("IOleInPlaceFrame::EnableModeless"); 
1334 HRESULT 
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
) 
1336         WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator"); 
1337         // TODO: send an event with this id 
1338     if (m_window
->m_oleInPlaceActiveObject
.Ok()) 
1339         m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
); 
1346 HRESULT 
FrameSite::CanInPlaceActivate() 
1348         WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate"); 
1352 HRESULT 
FrameSite::OnInPlaceActivate() 
1354         WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate"); 
1355         m_bInPlaceActive 
= true; 
1359 HRESULT 
FrameSite::OnUIActivate() 
1361         WXOLE_TRACE("IOleInPlaceSite::OnUIActivate"); 
1366 HRESULT 
FrameSite::GetWindowContext(IOleInPlaceFrame 
**ppFrame
, 
1367                                                                         IOleInPlaceUIWindow 
**ppDoc
, 
1369                                                                         LPRECT lprcClipRect
, 
1370                                                                         LPOLEINPLACEFRAMEINFO lpFrameInfo
) 
1372         WXOLE_TRACE("IOleInPlaceSite::GetWindowContext"); 
1373         if (ppFrame 
== NULL 
|| ppDoc 
== NULL 
|| lprcPosRect 
== NULL 
|| 
1374                 lprcClipRect 
== NULL 
|| lpFrameInfo 
== NULL
) 
1376                 if (ppFrame 
!= NULL
) 
1380                 return E_INVALIDARG
; 
1383     HRESULT hr 
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
); 
1384     if (! SUCCEEDED(hr
)) 
1386         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !"); 
1387         return E_UNEXPECTED
; 
1390     hr 
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
); 
1391     if (! SUCCEEDED(hr
)) 
1393         WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !"); 
1394         (*ppFrame
)->Release(); 
1396         return E_UNEXPECTED
; 
1400         m_window
->GetClientSize(&w
, &h
); 
1403             lprcPosRect
->left 
= lprcPosRect
->top 
= 0; 
1404             lprcPosRect
->right 
= w
; 
1405             lprcPosRect
->bottom 
= h
; 
1409             lprcClipRect
->left 
= lprcClipRect
->top 
= 0; 
1410             lprcClipRect
->right 
= w
; 
1411             lprcClipRect
->bottom 
= h
; 
1414     memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
)); 
1415     lpFrameInfo
->cb 
= sizeof(OLEINPLACEFRAMEINFO
); 
1416         lpFrameInfo
->hwndFrame 
= m_hWndParent
; 
1421 HRESULT 
FrameSite::Scroll(SIZE scrollExtent
) 
1423         WXOLE_TRACE("IOleInPlaceSite::Scroll"); 
1427 HRESULT 
FrameSite::OnUIDeactivate(BOOL fUndoable
) 
1429         WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate"); 
1430         m_bUIActive 
= false; 
1434 HRESULT 
FrameSite::OnInPlaceDeactivate() 
1436         WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate"); 
1437         m_bInPlaceActive 
= false; 
1441 HRESULT 
FrameSite::DiscardUndoState() 
1443         WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState"); 
1447 HRESULT 
FrameSite::DeactivateAndUndo() 
1449         WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo"); 
1453 HRESULT 
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
) 
1455         WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange"); 
1456     if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
) 
1457         m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
); 
1464 HRESULT 
FrameSite::OnInPlaceActivateEx(BOOL 
* pfNoRedraw
, DWORD dwFlags
) 
1466         WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx"); 
1467         OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
); 
1469         (*pfNoRedraw
) = FALSE
; 
1473 HRESULT 
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
) 
1475         WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx"); 
1476     OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
); 
1480 HRESULT 
FrameSite::RequestUIActivate() 
1482         WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate"); 
1489 HRESULT 
FrameSite::SaveObject() 
1491         WXOLE_TRACE("IOleClientSite::SaveObject"); 
1495 HRESULT 
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
, 
1498         WXOLE_TRACE("IOleClientSite::GetMoniker"); 
1502 HRESULT 
FrameSite::GetContainer(LPOLECONTAINER 
* ppContainer
) 
1504         WXOLE_TRACE("IOleClientSite::GetContainer"); 
1505         if (ppContainer 
== NULL
) 
1506         return E_INVALIDARG
; 
1508     HRESULT hr 
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
)); 
1509     wxASSERT(SUCCEEDED(hr
)); 
1514 HRESULT 
FrameSite::ShowObject() 
1516         WXOLE_TRACE("IOleClientSite::ShowObject"); 
1517         if (m_window
->m_oleObjectHWND
) 
1518                 ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
); 
1522 HRESULT 
FrameSite::OnShowWindow(BOOL fShow
) 
1524         WXOLE_TRACE("IOleClientSite::OnShowWindow"); 
1528 HRESULT 
FrameSite::RequestNewObjectLayout() 
1530         WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout"); 
1534 // IParseDisplayName 
1536 HRESULT 
FrameSite::ParseDisplayName(IBindCtx 
*pbc
, LPOLESTR pszDisplayName
, 
1537                                                                         ULONG 
*pchEaten
, IMoniker 
**ppmkOut
) 
1539         WXOLE_TRACE("IParseDisplayName::ParseDisplayName"); 
1545 HRESULT 
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown 
**ppenum
) 
1547         WXOLE_TRACE("IOleContainer::EnumObjects"); 
1551 HRESULT 
FrameSite::LockContainer(BOOL fLock
) 
1553         WXOLE_TRACE("IOleContainer::LockContainer"); 
1560 HRESULT 
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
, 
1561                                                          IBindCtx 
* pbc
, REFIID riid
, void ** ppvObject
) 
1563         WXOLE_TRACE("IOleItemContainer::GetObject"); 
1564         if (pszItem 
== NULL
) 
1565         return E_INVALIDARG
; 
1566         if (ppvObject 
== NULL
) 
1567         return E_INVALIDARG
; 
1570         return MK_E_NOOBJECT
; 
1573 HRESULT 
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx 
* pbc
, 
1574                                                                         REFIID riid
, void ** ppvStorage
) 
1576         WXOLE_TRACE("IOleItemContainer::GetObjectStorage"); 
1577         if (pszItem 
== NULL
) 
1578         return E_INVALIDARG
; 
1579         if (ppvStorage 
== NULL
) 
1580         return E_INVALIDARG
; 
1583         return MK_E_NOOBJECT
; 
1586 HRESULT 
FrameSite::IsRunning(LPOLESTR pszItem
) 
1588         WXOLE_TRACE("IOleItemContainer::IsRunning"); 
1589         if (pszItem 
== NULL
) 
1590         return E_INVALIDARG
; 
1592         return MK_E_NOOBJECT
; 
1599 HRESULT 
FrameSite::OnControlInfoChanged() 
1601         WXOLE_TRACE("IOleControlSite::OnControlInfoChanged"); 
1605 HRESULT 
FrameSite::LockInPlaceActive(BOOL fLock
) 
1607         WXOLE_TRACE("IOleControlSite::LockInPlaceActive"); 
1608         m_bInPlaceLocked 
= (fLock
) ? true : false; 
1612 HRESULT 
FrameSite::GetExtendedControl(IDispatch 
** ppDisp
) 
1614         WXOLE_TRACE("IOleControlSite::GetExtendedControl"); 
1618 HRESULT 
FrameSite::TransformCoords(POINTL 
* pPtlHimetric
, POINTF 
* pPtfContainer
, DWORD dwFlags
) 
1620         WXOLE_TRACE("IOleControlSite::TransformCoords"); 
1623         if (pPtlHimetric 
== NULL
) 
1624                 return E_INVALIDARG
; 
1626         if (pPtfContainer 
== NULL
) 
1627                 return E_INVALIDARG
; 
1633 HRESULT 
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
) 
1635         WXOLE_TRACE("IOleControlSite::TranslateAccelerator"); 
1636         // TODO: send an event with this id 
1640 HRESULT 
FrameSite::OnFocus(BOOL fGotFocus
) 
1642         WXOLE_TRACE("IOleControlSite::OnFocus"); 
1646 HRESULT 
FrameSite::ShowPropertyFrame() 
1648         WXOLE_TRACE("IOleControlSite::ShowPropertyFrame"); 
1654 HRESULT 
FrameSite::QueryStatus(const GUID 
* pguidCmdGroup
, ULONG cCmds
, 
1655                                                            OLECMD 
* prgCmds
, OLECMDTEXT 
* pCmdTet
) 
1657         WXOLE_TRACE("IOleCommandTarget::QueryStatus"); 
1658         if (prgCmds 
== NULL
) return E_INVALIDARG
; 
1659         bool bCmdGroupFound 
= false; 
1661         for (ULONG nCmd 
= 0; nCmd 
< cCmds
; nCmd
++) 
1663                 // unsupported by default 
1664                 prgCmds
[nCmd
].cmdf 
= 0; 
1669         if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
1673 HRESULT 
FrameSite::Exec(const GUID 
* pguidCmdGroup
, DWORD nCmdID
, 
1674                                                 DWORD nCmdExecOpt
, VARIANTARG 
* pVaIn
, 
1675                                                 VARIANTARG 
* pVaOut
) 
1677         WXOLE_TRACE("IOleCommandTarget::Exec"); 
1678         bool bCmdGroupFound 
= false; 
1680         if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; } 
1681         return OLECMDERR_E_NOTSUPPORTED
; 
1686 void STDMETHODCALLTYPE 
FrameSite::OnDataChange(FORMATETC 
* pFormatEtc
, STGMEDIUM 
* pgStgMed
) 
1688         WXOLE_TRACE("IAdviseSink::OnDataChange"); 
1691 void STDMETHODCALLTYPE 
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
) 
1693         WXOLE_TRACE("IAdviseSink::OnViewChange"); 
1694         // redraw the control 
1697 void STDMETHODCALLTYPE 
FrameSite::OnRename(IMoniker 
* pmk
) 
1699         WXOLE_TRACE("IAdviseSink::OnRename"); 
1702 void STDMETHODCALLTYPE 
FrameSite::OnSave() 
1704         WXOLE_TRACE("IAdviseSink::OnSave"); 
1707 void STDMETHODCALLTYPE 
FrameSite::OnClose() 
1709         WXOLE_TRACE("IAdviseSink::OnClose"); 
1712 ///////////////////////////////////////////// 
1714 HRESULT STDMETHODCALLTYPE 
FrameSite::ActivateMe( 
1715         /* [in] */ IOleDocumentView __RPC_FAR 
*pViewToActivate
) 
1717     wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch 
*) this); 
1718     if (!inPlaceSite
.Ok()) 
1721     if (pViewToActivate
) 
1723         m_window
->m_docView 
= pViewToActivate
; 
1724         m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
1728         wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
); 
1732         HRESULT hr 
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef()); 
1736                 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
); 
1739     m_window
->m_docView
->UIActivate(TRUE
); 
1746 static IMalloc 
*iMalloc 
= NULL
; 
1748 IMalloc 
*wxOleInit::GetIMalloc() 
1754 wxOleInit::wxOleInit() 
1756     if (OleInitialize(NULL
) == S_OK 
&& iMalloc 
== NULL
) 
1757             CoGetMalloc(1, &iMalloc
); 
1762 wxOleInit::~wxOleInit() 
1766         if (iMalloc
->Release() == 0) 
1773 wxString 
OLEHResultToString(HRESULT hr
) 
1778         return wxEmptyString
; 
1780     case OLECMDERR_E_UNKNOWNGROUP
: 
1781                 return wxT("The pguidCmdGroup parameter is not NULL but does not specify a recognized command group."); 
1783     case OLECMDERR_E_NOTSUPPORTED
: 
1784                 return wxT("The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup."); 
1786     case OLECMDERR_E_DISABLED
: 
1787                 return wxT("The command identified by nCmdID is currently disabled and cannot be executed."); 
1789     case OLECMDERR_E_NOHELP
: 
1790                 return wxT("The caller has asked for help on the command identified by nCmdID, but no help is available."); 
1792     case OLECMDERR_E_CANCELED
: 
1793                 return wxT("The user canceled the execution of the command."); 
1796         return wxT("E_INVALIDARG"); 
1799         return wxT("E_OUTOFMEMORY"); 
1802         return wxT("E_NOINTERFACE"); 
1805         return wxT("E_UNEXPECTED"); 
1807     case STG_E_INVALIDFLAG
: 
1808         return wxT("STG_E_INVALIDFLAG"); 
1811         return wxT("E_FAIL"); 
1814         return wxT("E_NOTIMPL"); 
1819             buf
.Printf(wxT("Unknown - 0x%X"), hr
); 
1825 // borrowed from src/msw/ole/oleutils.cpp 
1826 wxString 
GetIIDName(REFIID riid
) 
1828   // an association between symbolic name and numeric value of an IID 
1832     const wxChar 
*szName
; 
1835   // construct the table containing all known interfaces 
1836   #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) } 
1837   #define ADD_KNOWN_GUID(name) { &name, _T(#name) } 
1839   static const KNOWN_IID aKnownIids
[] = 
1841     ADD_KNOWN_IID(AdviseSink
), 
1842     ADD_KNOWN_IID(AdviseSink2
), 
1843     ADD_KNOWN_IID(BindCtx
), 
1844     ADD_KNOWN_IID(ClassFactory
), 
1845 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__) 
1846     ADD_KNOWN_IID(ContinueCallback
), 
1847     ADD_KNOWN_IID(EnumOleDocumentViews
), 
1848     ADD_KNOWN_IID(OleCommandTarget
), 
1849     ADD_KNOWN_IID(OleDocument
), 
1850     ADD_KNOWN_IID(OleDocumentSite
), 
1851     ADD_KNOWN_IID(OleDocumentView
), 
1852     ADD_KNOWN_IID(Print
), 
1854     ADD_KNOWN_IID(DataAdviseHolder
), 
1855     ADD_KNOWN_IID(DataObject
), 
1856     ADD_KNOWN_IID(Debug
), 
1857     ADD_KNOWN_IID(DebugStream
), 
1858     ADD_KNOWN_IID(DfReserved1
), 
1859     ADD_KNOWN_IID(DfReserved2
), 
1860     ADD_KNOWN_IID(DfReserved3
), 
1861     ADD_KNOWN_IID(Dispatch
), 
1862     ADD_KNOWN_IID(DropSource
), 
1863     ADD_KNOWN_IID(DropTarget
), 
1864     ADD_KNOWN_IID(EnumCallback
), 
1865     ADD_KNOWN_IID(EnumFORMATETC
), 
1866     ADD_KNOWN_IID(EnumGeneric
), 
1867     ADD_KNOWN_IID(EnumHolder
), 
1868     ADD_KNOWN_IID(EnumMoniker
), 
1869     ADD_KNOWN_IID(EnumOLEVERB
), 
1870     ADD_KNOWN_IID(EnumSTATDATA
), 
1871     ADD_KNOWN_IID(EnumSTATSTG
), 
1872     ADD_KNOWN_IID(EnumString
), 
1873     ADD_KNOWN_IID(EnumUnknown
), 
1874     ADD_KNOWN_IID(EnumVARIANT
), 
1875     ADD_KNOWN_IID(ExternalConnection
), 
1876     ADD_KNOWN_IID(InternalMoniker
), 
1877     ADD_KNOWN_IID(LockBytes
), 
1878     ADD_KNOWN_IID(Malloc
), 
1879     ADD_KNOWN_IID(Marshal
), 
1880     ADD_KNOWN_IID(MessageFilter
), 
1881     ADD_KNOWN_IID(Moniker
), 
1882     ADD_KNOWN_IID(OleAdviseHolder
), 
1883     ADD_KNOWN_IID(OleCache
), 
1884     ADD_KNOWN_IID(OleCache2
), 
1885     ADD_KNOWN_IID(OleCacheControl
), 
1886     ADD_KNOWN_IID(OleClientSite
), 
1887     ADD_KNOWN_IID(OleContainer
), 
1888     ADD_KNOWN_IID(OleInPlaceActiveObject
), 
1889     ADD_KNOWN_IID(OleInPlaceFrame
), 
1890     ADD_KNOWN_IID(OleInPlaceObject
), 
1891     ADD_KNOWN_IID(OleInPlaceSite
), 
1892     ADD_KNOWN_IID(OleInPlaceUIWindow
), 
1893     ADD_KNOWN_IID(OleItemContainer
), 
1894     ADD_KNOWN_IID(OleLink
), 
1895     ADD_KNOWN_IID(OleManager
), 
1896     ADD_KNOWN_IID(OleObject
), 
1897     ADD_KNOWN_IID(OlePresObj
), 
1898     ADD_KNOWN_IID(OleWindow
), 
1899     ADD_KNOWN_IID(PSFactory
), 
1900     ADD_KNOWN_IID(ParseDisplayName
), 
1901     ADD_KNOWN_IID(Persist
), 
1902     ADD_KNOWN_IID(PersistFile
), 
1903     ADD_KNOWN_IID(PersistStorage
), 
1904     ADD_KNOWN_IID(PersistStream
), 
1905     ADD_KNOWN_IID(ProxyManager
), 
1906     ADD_KNOWN_IID(RootStorage
), 
1907     ADD_KNOWN_IID(RpcChannel
), 
1908     ADD_KNOWN_IID(RpcProxy
), 
1909     ADD_KNOWN_IID(RpcStub
), 
1910     ADD_KNOWN_IID(RunnableObject
), 
1911     ADD_KNOWN_IID(RunningObjectTable
), 
1912     ADD_KNOWN_IID(StdMarshalInfo
), 
1913     ADD_KNOWN_IID(Storage
), 
1914     ADD_KNOWN_IID(Stream
), 
1915     ADD_KNOWN_IID(StubManager
), 
1916     ADD_KNOWN_IID(Unknown
), 
1917     ADD_KNOWN_IID(ViewObject
), 
1918     ADD_KNOWN_IID(ViewObject2
), 
1919     ADD_KNOWN_GUID(IID_IDispatch
), 
1920     ADD_KNOWN_GUID(IID_IWebBrowser
), 
1921     ADD_KNOWN_GUID(IID_IWebBrowserApp
), 
1922     ADD_KNOWN_GUID(IID_IWebBrowser2
), 
1923     ADD_KNOWN_GUID(IID_IWebBrowser
), 
1924     ADD_KNOWN_GUID(DIID_DWebBrowserEvents2
), 
1925     ADD_KNOWN_GUID(DIID_DWebBrowserEvents
), 
1928   // don't clobber preprocessor name space 
1929   #undef ADD_KNOWN_IID 
1930   #undef ADD_KNOWN_GUID 
1932   // try to find the interface in the table 
1933   for ( size_t ui 
= 0; ui 
< WXSIZEOF(aKnownIids
); ui
++ ) 
1935     if ( riid 
== *aKnownIids
[ui
].pIid 
) 
1937       return aKnownIids
[ui
].szName
; 
1941   // unknown IID, just transform to string 
1942   LPOLESTR str 
= NULL
; 
1943   StringFromIID(riid
, &str
); 
1951       return wxT("StringFromIID() error");