2 wxActiveX Library Licence, Version 3
3 ====================================
5 Copyright (C) 2003 Lindsay Mathieson [, ...]
7 Everyone is permitted to copy and distribute verbatim copies
8 of this licence document, but changing it is not allowed.
10 wxActiveX LIBRARY LICENCE
11 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
13 This library is free software; you can redistribute it and/or modify it
14 under the terms of the GNU Library General Public Licence as published by
15 the Free Software Foundation; either version 2 of the Licence, or (at
16 your option) any later version.
18 This library is distributed in the hope that it will be useful, but
19 WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
21 General Public Licence for more details.
23 You should have received a copy of the GNU Library General Public Licence
24 along with this software, usually in a file named COPYING.LIB. If not,
25 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
26 Boston, MA 02111-1307 USA.
30 1. As a special exception, the copyright holders of this library give
31 permission for additional uses of the text contained in this release of
32 the library as licenced under the wxActiveX Library Licence, applying
33 either version 3 of the Licence, or (at your option) any later version of
34 the Licence as published by the copyright holders of version 3 of the
37 2. The exception is that you may use, copy, link, modify and distribute
38 under the user's own terms, binary object code versions of works based
41 3. If you copy code from files distributed under the terms of the GNU
42 General Public Licence or the GNU Library General Public Licence into a
43 copy of this library, as this licence permits, the exception does not
44 apply to the code that you add in this way. To avoid misleading anyone as
45 to the status of such modified files, you must delete this exception
46 notice from such code and/or adjust the licensing conditions notice
49 4. If you write modifications of your own for this library, it is your
50 choice whether to permit this exception to apply to your modifications.
51 If you do not wish that, you must delete the exception notice from such
52 code and/or adjust the licensing conditions notice accordingly.
55 #include "wxActiveX.h"
56 #include <wx/strconv.h>
58 #include <wx/string.h>
59 #include <wx/datetime.h>
67 // Depending on compilation mode, the wx headers may have undef'd
68 // this, but in this case we need it so the virtual method in
69 // FrameSite will match what is in oleidl.h.
72 #define GetObject GetObjectW
74 #define GetObject GetObjectA
79 //////////////////////////////////////////////////////////////////////
80 BEGIN_EVENT_TABLE(wxActiveX
, wxWindow
)
81 EVT_SIZE(wxActiveX::OnSize
)
82 EVT_PAINT(wxActiveX::OnPaint
)
83 EVT_MOUSE_EVENTS(wxActiveX::OnMouse
)
84 EVT_SET_FOCUS(wxActiveX::OnSetFocus
)
85 EVT_KILL_FOCUS(wxActiveX::OnKillFocus
)
88 IMPLEMENT_CLASS(wxActiveX
, wxWindow
)
93 public IOleClientSite
,
94 public IOleInPlaceSiteEx
,
95 public IOleInPlaceFrame
,
96 public IOleItemContainer
,
98 public IOleCommandTarget
,
99 public IOleDocumentSite
,
101 public IOleControlSite
104 DECLARE_OLE_UNKNOWN(FrameSite
);
107 FrameSite(wxActiveX
* win
);
108 virtual ~FrameSite();
111 STDMETHODIMP
GetWindow(HWND
*);
112 STDMETHODIMP
ContextSensitiveHelp(BOOL
);
114 //IOleInPlaceUIWindow
115 STDMETHODIMP
GetBorder(LPRECT
);
116 STDMETHODIMP
RequestBorderSpace(LPCBORDERWIDTHS
);
117 STDMETHODIMP
SetBorderSpace(LPCBORDERWIDTHS
);
118 STDMETHODIMP
SetActiveObject(IOleInPlaceActiveObject
*, LPCOLESTR
);
121 STDMETHODIMP
InsertMenus(HMENU
, LPOLEMENUGROUPWIDTHS
);
122 STDMETHODIMP
SetMenu(HMENU
, HOLEMENU
, HWND
);
123 STDMETHODIMP
RemoveMenus(HMENU
);
124 STDMETHODIMP
SetStatusText(LPCOLESTR
);
125 STDMETHODIMP
EnableModeless(BOOL
);
126 STDMETHODIMP
TranslateAccelerator(LPMSG
, WORD
);
129 STDMETHODIMP
CanInPlaceActivate();
130 STDMETHODIMP
OnInPlaceActivate();
131 STDMETHODIMP
OnUIActivate();
132 STDMETHODIMP
GetWindowContext(IOleInPlaceFrame
**, IOleInPlaceUIWindow
**,
133 LPRECT
, LPRECT
, LPOLEINPLACEFRAMEINFO
);
134 STDMETHODIMP
Scroll(SIZE
);
135 STDMETHODIMP
OnUIDeactivate(BOOL
);
136 STDMETHODIMP
OnInPlaceDeactivate();
137 STDMETHODIMP
DiscardUndoState();
138 STDMETHODIMP
DeactivateAndUndo();
139 STDMETHODIMP
OnPosRectChange(LPCRECT
);
142 STDMETHODIMP
OnInPlaceActivateEx(BOOL
*, DWORD
);
143 STDMETHODIMP
OnInPlaceDeactivateEx(BOOL
);
144 STDMETHODIMP
RequestUIActivate();
147 STDMETHODIMP
SaveObject();
148 STDMETHODIMP
GetMoniker(DWORD
, DWORD
, IMoniker
**);
149 STDMETHODIMP
GetContainer(LPOLECONTAINER FAR
*);
150 STDMETHODIMP
ShowObject();
151 STDMETHODIMP
OnShowWindow(BOOL
);
152 STDMETHODIMP
RequestNewObjectLayout();
155 STDMETHODIMP
OnControlInfoChanged();
156 STDMETHODIMP
LockInPlaceActive(BOOL
);
157 STDMETHODIMP
GetExtendedControl(IDispatch
**);
158 STDMETHODIMP
TransformCoords(POINTL
*, POINTF
*, DWORD
);
159 STDMETHODIMP
TranslateAccelerator(LPMSG
, DWORD
);
160 STDMETHODIMP
OnFocus(BOOL
);
161 STDMETHODIMP
ShowPropertyFrame();
164 STDMETHODIMP
QueryStatus(const GUID
*, ULONG
, OLECMD
[], OLECMDTEXT
*);
165 STDMETHODIMP
Exec(const GUID
*, DWORD
, DWORD
, VARIANTARG
*, VARIANTARG
*);
168 STDMETHODIMP
ParseDisplayName(IBindCtx
*, LPOLESTR
, ULONG
*, IMoniker
**);
171 STDMETHODIMP
EnumObjects(DWORD
, IEnumUnknown
**);
172 STDMETHODIMP
LockContainer(BOOL
);
175 STDMETHODIMP
GetObject(LPOLESTR
, DWORD
, IBindCtx
*, REFIID
, void**);
176 STDMETHODIMP
GetObjectStorage(LPOLESTR
, IBindCtx
*, REFIID
, void**);
177 STDMETHODIMP
IsRunning(LPOLESTR
);
180 STDMETHODIMP
GetIDsOfNames(REFIID
, OLECHAR
**, unsigned int, LCID
, DISPID
*);
181 STDMETHODIMP
GetTypeInfo(unsigned int, LCID
, ITypeInfo
**);
182 STDMETHODIMP
GetTypeInfoCount(unsigned int*);
183 STDMETHODIMP
Invoke(DISPID
, REFIID
, LCID
, WORD
, DISPPARAMS
*, VARIANT
*, EXCEPINFO
*, UINT
*);
186 void STDMETHODCALLTYPE
OnDataChange(FORMATETC
*, STGMEDIUM
*);
187 void STDMETHODCALLTYPE
OnViewChange(DWORD
, LONG
);
188 void STDMETHODCALLTYPE
OnRename(IMoniker
*);
189 void STDMETHODCALLTYPE
OnSave();
190 void STDMETHODCALLTYPE
OnClose();
193 HRESULT STDMETHODCALLTYPE
ActivateMe(IOleDocumentView __RPC_FAR
*pViewToActivate
);
197 wxActiveX
* m_window
;
202 bool m_bSupportsWindowlessActivation
;
203 bool m_bInPlaceLocked
;
204 bool m_bInPlaceActive
;
210 LCID m_nAmbientLocale
;
211 COLORREF m_clrAmbientForeColor
;
212 COLORREF m_clrAmbientBackColor
;
213 bool m_bAmbientShowHatching
;
214 bool m_bAmbientShowGrabHandles
;
215 bool m_bAmbientAppearance
;
218 DEFINE_OLE_TABLE(FrameSite
)
219 OLE_INTERFACE(IID_IUnknown
, IOleClientSite
)
221 OLE_IINTERFACE(IOleClientSite
)
223 OLE_INTERFACE(IID_IOleWindow
, IOleInPlaceSite
)
224 OLE_IINTERFACE(IOleInPlaceSite
)
225 OLE_IINTERFACE(IOleInPlaceSiteEx
)
227 //OLE_IINTERFACE(IOleWindow)
228 OLE_IINTERFACE(IOleInPlaceUIWindow
)
229 OLE_IINTERFACE(IOleInPlaceFrame
)
231 OLE_IINTERFACE(IParseDisplayName
)
232 OLE_IINTERFACE(IOleContainer
)
233 OLE_IINTERFACE(IOleItemContainer
)
235 OLE_IINTERFACE(IDispatch
)
237 OLE_IINTERFACE(IOleCommandTarget
)
239 OLE_IINTERFACE(IOleDocumentSite
)
241 OLE_IINTERFACE(IAdviseSink
)
243 OLE_IINTERFACE(IOleControlSite
)
248 wxActiveX::wxActiveX(wxWindow
* parent
, REFCLSID clsid
, wxWindowID id
,
252 const wxString
& name
) :
253 wxWindow(parent
, id
, pos
, size
, style
, name
)
255 m_bAmbientUserMode
= true;
256 m_docAdviseCookie
= 0;
257 CreateActiveX(clsid
);
260 wxActiveX::wxActiveX(wxWindow
* parent
, const wxString
& progId
, wxWindowID id
,
264 const wxString
& name
) :
265 wxWindow(parent
, id
, pos
, size
, style
, name
)
267 m_bAmbientUserMode
= true;
268 m_docAdviseCookie
= 0;
269 CreateActiveX((LPOLESTR
) (const wchar_t *) progId
.wc_str(wxConvUTF8
));
272 wxActiveX::~wxActiveX()
274 // disconnect connection points
275 wxOleConnectionArray::iterator it
= m_connections
.begin();
276 while (it
!= m_connections
.end())
278 wxOleConnectionPoint
& cp
= it
->first
;
279 cp
->Unadvise(it
->second
);
283 m_connections
.clear();
285 if (m_oleInPlaceObject
.Ok())
287 m_oleInPlaceObject
->InPlaceDeactivate();
288 m_oleInPlaceObject
->UIDeactivate();
292 if (m_oleObject
.Ok())
294 if (m_docAdviseCookie
!= 0)
295 m_oleObject
->Unadvise(m_docAdviseCookie
);
297 m_oleObject
->DoVerb(OLEIVERB_HIDE
, NULL
, m_clientSite
, 0, (HWND
) GetHWND(), NULL
);
298 m_oleObject
->Close(OLECLOSE_NOSAVE
);
299 m_oleObject
->SetClientSite(NULL
);
302 // Unregister object as active
303 RevokeActiveObject(m_pdwRegister
, NULL
);
306 void wxActiveX::CreateActiveX(REFCLSID clsid
)
310 ////////////////////////////////////////////////////////
312 FrameSite
*frame
= new FrameSite(this);
314 hret
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch
*) frame
);
315 wxCHECK_RET(SUCCEEDED(hret
), _T("m_clientSite.QueryInterface failed"));
317 wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch
*) frame
);
318 wxCHECK_RET(adviseSink
.Ok(), _T("adviseSink not Ok"));
321 // Create Object, get IUnknown interface
322 m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
);
323 wxCHECK_RET(m_ActiveX
.Ok(), _T("m_ActiveX.CreateInstance failed"));
325 // Register object as active
326 unsigned long pdwRegister
;
327 hret
= RegisterActiveObject(m_ActiveX
, clsid
, ACTIVEOBJECT_WEAK
, &m_pdwRegister
);
328 WXOLE_WARN(hret
, "Unable to register object as active");
330 // Get Dispatch interface
331 hret
= m_Dispatch
.QueryInterface(IID_IDispatch
, m_ActiveX
);
332 WXOLE_WARN(hret
, "Unable to get dispatch interface");
337 // Get IOleObject interface
338 hret
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);
339 wxCHECK_RET(SUCCEEDED(hret
), _("Unable to get IOleObject interface"));
341 // get IViewObject Interface
342 hret
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
);
343 wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IViewObject Interface"));
346 m_docAdviseCookie
= 0;
347 hret
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
);
348 WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")");
349 m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
);
350 OleSetContainedObject(m_oleObject
, TRUE
);
354 // Get IOleInPlaceObject interface
355 hret
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
);
356 wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IOleInPlaceObject interface"));
360 m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
);
361 wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get oleObject status"));
363 // set client site first ?
364 if (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
)
365 m_oleObject
->SetClientSite(m_clientSite
);
369 wxAutoOleInterface
<IPersistStreamInit
>
370 pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
);
372 if (pPersistStreamInit
.Ok())
374 hret
= pPersistStreamInit
->InitNew();
375 WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()");
378 if (! (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
))
379 m_oleObject
->SetClientSite(m_clientSite
);
383 GetClientSize(&w
, &h
);
392 if (m_oleInPlaceObject
.Ok())
394 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
395 WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)");
397 ::SetActiveWindow(m_oleObjectHWND
);
401 if (! (dwMiscStatus
& OLEMISC_INVISIBLEATRUNTIME
))
403 if (w
> 0 && h
> 0 && m_oleInPlaceObject
.Ok())
404 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
406 hret
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
);
407 hret
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
);
410 if (! m_oleObjectHWND
&& m_oleInPlaceObject
.Ok())
412 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
413 WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)");
418 ::SetActiveWindow(m_oleObjectHWND
);
419 ::ShowWindow(m_oleObjectHWND
, SW_SHOW
);
421 // Update by GBR to resize older controls
423 szEvent
.m_size
= wxSize(w
, h
) ;
424 GetEventHandler()->AddPendingEvent(szEvent
);
428 void wxActiveX::CreateActiveX(LPOLESTR progId
)
431 if (CLSIDFromProgID(progId
, &clsid
) != S_OK
)
434 CreateActiveX(clsid
);
437 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
438 // Case Insensitive Map of Event names to eventTypes
439 // created dynamically at run time in:
440 // EVT_ACTIVEX(eventName, id, fn)
441 // we map the pointer to them so that:
442 // const wxEventType& RegisterActiveXEvent(wxString eventName);
443 // can return a const reference, which is neccessary for event tables
444 // probably should use a wxWindows hash table here, but I'm lazy ...
445 typedef map
<wxString
, wxEventType
*, NS_wxActiveX::less_wxStringI
> ActiveXNamedEventMap
;
446 static ActiveXNamedEventMap sg_NamedEventMap
;
448 const wxEventType
& RegisterActiveXEvent(const wxChar
*eventName
)
450 wxString ev
= eventName
;
451 ActiveXNamedEventMap::iterator it
= sg_NamedEventMap
.find(ev
);
452 if (it
== sg_NamedEventMap
.end())
454 wxEventType
*et
= new wxEventType(wxNewEventType());
455 sg_NamedEventMap
[ev
] = et
;
460 return *(it
->second
);
464 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
465 // Map of Event DISPID's to eventTypes
466 // created dynamically at run time in:
467 // EVT_ACTIVEX(eventName, id, fn)
468 // we map the pointer to them so that:
469 // const wxEventType& RegisterActiveXEvent(wxString eventName);
470 // can return a const reference, which is neccessary for event tables
472 typedef map
<DISPID
, wxEventType
*> ActiveXDISPIDEventMap
;
473 static ActiveXDISPIDEventMap sg_dispIdEventMap
;
475 const wxEventType
& RegisterActiveXEvent(DISPID event
)
477 ActiveXDISPIDEventMap::iterator it
= sg_dispIdEventMap
.find(event
);
478 if (it
== sg_dispIdEventMap
.end())
480 wxEventType
*et
= new wxEventType(wxNewEventType());
481 sg_dispIdEventMap
[event
] = et
;
486 return *(it
->second
);
489 // one off class for automatic freeing of activeX eventtypes
490 class ActiveXEventMapFlusher
493 ~ActiveXEventMapFlusher()
496 ActiveXNamedEventMap::iterator it
= sg_NamedEventMap
.end();
497 while (it
!= sg_NamedEventMap
.end())
502 sg_NamedEventMap
.clear();
505 ActiveXDISPIDEventMap::iterator dit
= sg_dispIdEventMap
.end();
506 while (dit
!= sg_dispIdEventMap
.end())
511 sg_dispIdEventMap
.clear();
515 static ActiveXEventMapFlusher s_dummyActiveXEventMapFlusher
;
518 //////////////////////////////////////////////////////
519 VARTYPE
wxTypeToVType(const wxVariant
& v
)
521 wxString type
= v
.GetType();
522 if (type
== wxT("bool"))
524 else if (type
== wxT("char"))
526 else if (type
== wxT("datetime"))
528 else if (type
== wxT("double"))
530 else if (type
== wxT("list"))
532 else if (type
== wxT("long"))
534 else if (type
== wxT("string"))
536 else if (type
== wxT("stringlist"))
538 else if (type
== wxT("date"))
540 else if (type
== wxT("time"))
542 else if (type
== wxT("void*"))
543 return VT_VOID
| VT_BYREF
;
548 bool wxDateTimeToDATE(wxDateTime dt
, DATE
& d
)
551 memset(&st
, 0, sizeof(st
));
553 st
.wYear
= dt
.GetYear();
554 st
.wMonth
= dt
.GetMonth() + 1;
555 st
.wDay
= dt
.GetDay();
556 st
.wHour
= dt
.GetHour();
557 st
.wMinute
= dt
.GetMinute();
558 st
.wSecond
= dt
.GetSecond();
559 st
.wMilliseconds
= dt
.GetMillisecond();
560 return SystemTimeToVariantTime(&st
, &d
) != FALSE
;
563 bool wxDateTimeToVariant(wxDateTime dt
, VARIANTARG
& va
)
565 return wxDateTimeToDATE(dt
, va
.date
);
568 bool DATEToWxDateTime(DATE date
, wxDateTime
& dt
)
571 if (! VariantTimeToSystemTime(date
, &st
))
576 wxDateTime::Month(int(wxDateTime::Jan
) + st
.wMonth
- 1),
578 st
.wHour
, st
.wMinute
, st
.wSecond
, st
.wMilliseconds
);
583 bool VariantToWxDateTime(VARIANTARG va
, wxDateTime
& dt
)
585 HRESULT hr
= VariantChangeType(&va
, &va
, 0, VT_DATE
);
589 return DATEToWxDateTime(va
.date
, dt
);
592 bool MSWVariantToVariant(VARIANTARG
& va
, wxVariant
& vx
)
598 return false; // don't support arrays yet
611 return MSWVariantToVariant(*va
.pvarVal
, vx
);
615 VariantChangeType(&tmp
, &tmp
, 0, wxTypeToVType(vx
));
616 bool rc
= MSWVariantToVariant(tmp
, vx
);
625 vx
= (char) *va
.pbVal
;
634 vx
= (long) *va
.puiVal
;
636 vx
= (long) va
.uiVal
;
646 vx
= (long) *va
.pulVal
;
648 vx
= (long) va
.ulVal
;
670 vx
= (*va
.pboolVal
? true : false);
672 vx
= (va
.boolVal
? true : false);
677 return false; // what the hell is a CY ?
684 hr
= VarR8FromDec(va
.pdecVal
, &d
);
686 hr
= VarR8FromDec(&va
.decVal
, &d
);
689 return SUCCEEDED(hr
);
697 rc
= DATEToWxDateTime(*va
.pdate
, dt
);
699 rc
= VariantToWxDateTime(va
, dt
);
706 vx
= wxString(*va
.pbstrVal
);
708 vx
= wxString(va
.bstrVal
);
711 case VT_UNKNOWN
: // should do a custom wxVariantData for this
713 vx
= (void *) *va
.ppunkVal
;
715 vx
= (void *) va
.punkVal
;
718 case VT_DISPATCH
: // should do a custom wxVariantData for this
720 vx
= (void *) *va
.ppdispVal
;
722 vx
= (void *) va
.pdispVal
;
731 bool VariantToMSWVariant(const wxVariant
& vx
, VARIANTARG
& va
)
737 return false; // don't support arrays yet
749 return VariantToMSWVariant(vx
, *va
.pvarVal
);
752 va
.vt
= wxTypeToVType(vx
);
753 return VariantToMSWVariant(vx
, va
);
760 *va
.pbVal
= (char) vx
;
769 *va
.puiVal
= (long) vx
;
771 va
.uiVal
= (long) vx
;
781 *va
.pulVal
= (long) vx
;
783 va
.ulVal
= (long) vx
;
790 *va
.pfltVal
= (double) vx
;
792 va
.fltVal
= (double) vx
;
798 *va
.pdblVal
= (double) vx
;
800 va
.dblVal
= (double) vx
;
805 *va
.pboolVal
= ((bool) vx
) ? TRUE
: FALSE
;
807 va
.boolVal
= ((bool) vx
) ? TRUE
: FALSE
;
811 return false; // what the hell is a CY ?
815 return SUCCEEDED(VarDecFromR8(vx
, va
.pdecVal
));
817 return SUCCEEDED(VarDecFromR8(vx
, &va
.decVal
));
821 return wxDateTimeToDATE(vx
, *va
.pdate
);
823 return wxDateTimeToVariant(vx
,va
);
827 *va
.pbstrVal
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
));
829 va
.bstrVal
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
));
832 case VT_UNKNOWN
: // should do a custom wxVariantData for this
834 *va
.ppunkVal
= (IUnknown
*) (void *) vx
;
836 va
.punkVal
= (IUnknown
*) (void *) vx
;
839 case VT_DISPATCH
: // should do a custom wxVariantData for this
841 *va
.ppdispVal
= (IDispatch
*) (void *) vx
;
843 va
.pdispVal
= (IDispatch
*) (void *) vx
;
851 IMPLEMENT_CLASS(wxActiveXEvent
, wxCommandEvent
)
853 class wxActiveXEvents
: public IDispatch
856 DECLARE_OLE_UNKNOWN(wxActiveXEvents
);
859 wxActiveX
*m_activeX
;
863 friend bool wxActiveXEventsInterface(wxActiveXEvents
*self
, REFIID iid
, void **_interface
, const char *&desc
);
866 wxActiveXEvents(wxActiveX
*ax
) : m_activeX(ax
), m_haveCustomId(false) {}
867 wxActiveXEvents(wxActiveX
*ax
, REFIID iid
) : m_activeX(ax
), m_haveCustomId(true), m_customId(iid
) {}
868 virtual ~wxActiveXEvents()
873 STDMETHODIMP
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
)
878 STDMETHODIMP
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
)
883 STDMETHODIMP
GetTypeInfoCount(unsigned int* i
)
889 void DispatchEvent(wxActiveX::FuncX
&func
, const wxEventType
& eventType
, DISPPARAMS
* pDispParams
)
891 wxActiveXEvent event
;
892 event
.SetId(m_activeX
->GetId());
893 event
.SetEventType(eventType
);
894 event
.m_params
.NullList();
895 event
.m_params
.SetName(func
.name
);
901 // sometimes the pDispParams does not match the param info for a activex control
902 int nArg
= wxMin(func
.params
.size(), pDispParams
->cArgs
);
903 for (int i
= nArg
- 1; i
>= 0; i
--)
905 VARIANTARG
& va
= pDispParams
->rgvarg
[i
];
906 wxActiveX::ParamX
&px
= func
.params
[nArg
- i
- 1];
910 MSWVariantToVariant(va
, vx
);
911 event
.m_params
.Append(vx
);
917 int nArg
= wxMin(func
.params
.size(), pDispParams
->cArgs
);
918 m_activeX
->GetEventHandler()->ProcessEvent(event
);
919 for (int i
= 0; i
< nArg
; i
++)
921 VARIANTARG
& va
= pDispParams
->rgvarg
[i
];
922 wxActiveX::ParamX
&px
= func
.params
[nArg
- i
- 1];
926 wxVariant
& vx
= event
.m_params
[nArg
- i
- 1];
928 VariantToMSWVariant(vx
, va
);
933 m_activeX
->GetEventHandler()->AddPendingEvent(event
);
937 STDMETHODIMP
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
938 WORD wFlags
, DISPPARAMS
* pDispParams
,
939 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
,
940 unsigned int * puArgErr
)
942 if (wFlags
& (DISPATCH_PROPERTYGET
| DISPATCH_PROPERTYPUT
| DISPATCH_PROPERTYPUTREF
))
947 // find event for dispid
948 wxActiveX::MemberIdMap::iterator mit
= m_activeX
->m_eventMemberIds
.find((MEMBERID
) dispIdMember
);
949 if (mit
== m_activeX
->m_eventMemberIds
.end())
953 int midx
= mit
->second
;
954 if (midx
< 0 || midx
>= m_activeX
->GetEventCount())
957 wxActiveX::FuncX
&func
= m_activeX
->m_events
[midx
];
960 // try to find dispid event
961 ActiveXDISPIDEventMap::iterator dit
= sg_dispIdEventMap
.find(dispIdMember
);
962 if (dit
!= sg_dispIdEventMap
.end())
965 DispatchEvent(func
, *(dit
->second
), pDispParams
);
970 ActiveXNamedEventMap::iterator nit
= sg_NamedEventMap
.find(func
.name
);
971 if (nit
== sg_NamedEventMap
.end())
975 DispatchEvent(func
, *(nit
->second
), pDispParams
);
980 bool wxActiveXEventsInterface(wxActiveXEvents
*self
, REFIID iid
, void **_interface
, const char *&desc
)
982 if (self
->m_haveCustomId
&& IsEqualIID(iid
, self
->m_customId
))
984 WXOLE_TRACE("Found Custom Dispatch Interface");
985 *_interface
= (IUnknown
*) (IDispatch
*) self
;
986 desc
= "Custom Dispatch Interface";
993 DEFINE_OLE_TABLE(wxActiveXEvents
)
994 OLE_IINTERFACE(IUnknown
)
995 OLE_INTERFACE(IID_IDispatch
, IDispatch
)
996 OLE_INTERFACE_CUSTOM(wxActiveXEventsInterface
)
999 wxString
wxActiveXEvent::EventName()
1001 return m_params
.GetName();
1004 int wxActiveXEvent::ParamCount() const
1006 return m_params
.GetCount();
1009 wxString
wxActiveXEvent::ParamType(int idx
)
1011 wxASSERT(idx
>= 0 && idx
< m_params
.GetCount());
1013 return m_params
[idx
].GetType();
1016 wxString
wxActiveXEvent::ParamName(int idx
)
1018 wxASSERT(idx
>= 0 && idx
< m_params
.GetCount());
1020 return m_params
[idx
].GetName();
1023 static wxVariant nullVar
;
1025 wxVariant
& wxActiveXEvent::operator[] (int idx
)
1027 wxASSERT(idx
>= 0 && idx
< ParamCount());
1029 return m_params
[idx
];
1032 wxVariant
& wxActiveXEvent::operator[] (wxString name
)
1034 for (int i
= 0; i
< m_params
.GetCount(); i
++)
1036 if (name
.CmpNoCase(m_params
[i
].GetName()) == 0)
1040 wxString err
= _T("wxActiveXEvent::operator[] invalid name <") + name
+ _T(">");
1041 err
+= _T("\r\nValid Names = :\r\n");
1042 for (i
= 0; i
< m_params
.GetCount(); i
++)
1044 err
+= m_params
[i
].GetName();
1048 wxASSERT_MSG(false, err
);
1053 void wxActiveX::GetTypeInfo()
1056 We are currently only interested in the IDispatch interface
1057 to the control. For dual interfaces (TypeKind = TKIND_INTERFACE)
1058 we should drill down through the inheritance
1059 (using TYPEATTR->cImplTypes) and GetRefTypeOfImplType(n)
1060 and retrieve all the func names etc that way, then generate a C++
1063 But we don't do this and probably never will, so if we have a DUAL
1064 interface then we query for the IDispatch
1065 via GetRefTypeOfImplType(-1).
1070 // get type info via class info
1071 wxAutoOleInterface
<IProvideClassInfo
> classInfo(IID_IProvideClassInfo
, m_ActiveX
);
1072 if (! classInfo
.Ok())
1076 wxAutoOleInterface
<ITypeInfo
> typeInfo
;
1077 hret
= classInfo
->GetClassInfo(typeInfo
.GetRef());
1078 if (! typeInfo
.Ok())
1082 TYPEATTR
*ta
= NULL
;
1083 hret
= typeInfo
->GetTypeAttr(&ta
);
1087 // this should be a TKIND_COCLASS
1088 wxASSERT(ta
->typekind
== TKIND_COCLASS
);
1090 // iterate contained interfaces
1091 for (int i
= 0; i
< ta
->cImplTypes
; i
++)
1095 // get dispatch type info handle
1096 hret
= typeInfo
->GetRefTypeOfImplType(i
, &rt
);
1097 if (! SUCCEEDED(hret
))
1100 // get dispatch type info interface
1101 wxAutoOleInterface
<ITypeInfo
> ti
;
1102 hret
= typeInfo
->GetRefTypeInfo(rt
, ti
.GetRef());
1106 // check if default event sink
1107 bool defInterface
= false;
1108 bool defEventSink
= false;
1109 int impTypeFlags
= 0;
1110 typeInfo
->GetImplTypeFlags(i
, &impTypeFlags
);
1112 if (impTypeFlags
& IMPLTYPEFLAG_FDEFAULT
)
1114 if (impTypeFlags
& IMPLTYPEFLAG_FSOURCE
)
1116 WXOLE_TRACEOUT("Default Event Sink");
1117 defEventSink
= true;
1118 if (impTypeFlags
& IMPLTYPEFLAG_FDEFAULTVTABLE
)
1120 WXOLE_TRACEOUT("*ERROR* - Default Event Sink is via vTable");
1121 defEventSink
= false;
1126 WXOLE_TRACEOUT("Default Interface");
1127 defInterface
= true;
1133 GetTypeInfo(ti
, defInterface
, defEventSink
);
1138 typeInfo
->ReleaseTypeAttr(ta
);
1141 void ElemDescToParam(const ELEMDESC
& ed
, wxActiveX::ParamX
& param
)
1143 param
.flags
= ed
.idldesc
.wIDLFlags
;
1144 param
.vt
= ed
.tdesc
.vt
;
1145 param
.isPtr
= (param
.vt
== VT_PTR
);
1146 param
.isSafeArray
= (param
.vt
== VT_SAFEARRAY
);
1147 if (param
.isPtr
|| param
.isSafeArray
)
1148 param
.vt
= ed
.tdesc
.lptdesc
->vt
;
1151 void wxActiveX::GetTypeInfo(ITypeInfo
*ti
, bool defInterface
, bool defEventSink
)
1153 // wxAutoOleInterface<> assumes a ref has already been added
1155 wxAutoOleInterface
<ITypeInfo
> typeInfo(ti
);
1158 TYPEATTR
*ta
= NULL
;
1159 HRESULT hret
= typeInfo
->GetTypeAttr(&ta
);
1163 if (ta
->typekind
== TKIND_DISPATCH
)
1165 WXOLE_TRACEOUT("GUID = " << GetIIDName(ta
->guid
).c_str());
1169 wxActiveXEvents
*disp
= new wxActiveXEvents(this, ta
->guid
);
1170 ConnectAdvise(ta
->guid
, disp
);
1174 // See bug #1280715 in the wxActiveX SF project
1176 for (i
= 0; i
< ta
->cVars
; i
++) {
1177 VARDESC FAR
*vd
= NULL
;
1179 typeInfo
->GetVarDesc(i
, &vd
) ;
1180 BSTR bstrProperty
= NULL
;
1181 typeInfo
->GetDocumentation(vd
->memid
, &bstrProperty
,
1183 wxString
propName(bstrProperty
);
1184 m_props
.push_back(PropX());
1185 int idx
= m_props
.size() - 1;
1186 m_propNames
[propName
] = idx
;
1187 m_props
[idx
].name
= propName
;
1188 m_props
[idx
].memid
= vd
->memid
;
1191 param
.isSafeArray
= false;
1192 param
.isPtr
= false;
1193 param
.flags
= vd
->elemdescVar
.idldesc
.wIDLFlags
;
1194 param
.vt
= vd
->elemdescVar
.tdesc
.vt
;
1196 m_props
[idx
].arg
= param
;
1197 m_props
[idx
].type
= param
;
1200 // Get Function Names
1201 for (i
= 0; i
< ta
->cFuncs
; i
++)
1203 FUNCDESC FAR
*fd
= NULL
;
1205 hret
= typeInfo
->GetFuncDesc(i
, &fd
);
1209 BSTR anames
[1] = {NULL
};
1212 hret
= typeInfo
->GetNames(fd
->memid
, anames
, 1, &n
);
1216 wxString name
= anames
[0];
1218 WXOLE_TRACEOUT("Name " << i
<< " = " << name
.c_str());
1219 SysFreeString(anames
[0]);
1221 if (defInterface
|| defEventSink
)
1225 func
.memid
= fd
->memid
;
1226 func
.hasOut
= false;
1229 unsigned int maxPNames
= fd
->cParams
+ 1;
1230 unsigned int nPNames
= 0;
1231 BSTR
*pnames
= new BSTR
[maxPNames
];
1233 hret
= typeInfo
->GetNames(fd
->memid
, pnames
, maxPNames
, &nPNames
);
1236 if (fd
->cParams
< int(nPNames
))
1239 SysFreeString(pnames
[0]);
1243 ElemDescToParam(fd
->elemdescFunc
, func
.retType
);
1244 for (int p
= 0; p
< fd
->cParams
; p
++)
1248 ElemDescToParam(fd
->lprgelemdescParam
[p
], param
);
1250 param
.name
= pnames
[pbase
+ p
];
1251 SysFreeString(pnames
[pbase
+ p
]);
1253 param
.isOptional
= (p
> fd
->cParams
- fd
->cParamsOpt
);
1255 func
.hasOut
|= (param
.IsOut() || param
.isPtr
);
1256 func
.params
.push_back(param
);
1262 m_events
.push_back(func
);
1263 m_eventMemberIds
[fd
->memid
] = m_events
.size() - 1;
1267 if (fd
->invkind
== INVOKE_FUNC
)
1269 m_methods
.push_back(func
);
1270 m_methodNames
[func
.name
] = m_methods
.size() - 1;
1274 NameMap::iterator it
= m_propNames
.find(func
.name
);
1276 if (it
== m_propNames
.end())
1278 m_props
.push_back(PropX());
1279 idx
= m_props
.size() - 1;
1280 m_propNames
[func
.name
] = idx
;
1281 m_props
[idx
].name
= func
.name
;
1282 m_props
[idx
].memid
= func
.memid
;
1288 if (fd
->invkind
== INVOKE_PROPERTYGET
)
1289 m_props
[idx
].type
= func
.retType
;
1290 else if (func
.params
.size() > 0)
1292 m_props
[idx
].arg
= func
.params
[0];
1293 m_props
[idx
].putByRef
= (fd
->invkind
== INVOKE_PROPERTYPUTREF
);
1300 typeInfo
->ReleaseFuncDesc(fd
);
1304 typeInfo
->ReleaseTypeAttr(ta
);
1307 ///////////////////////////////////////////////
1308 // Type Info exposure
1309 const wxActiveX::FuncX
& wxActiveX::GetEventDesc(int idx
) const
1311 wxASSERT(idx
>= 0 && idx
< GetEventCount());
1313 return m_events
[idx
];
1316 const wxActiveX::PropX
& wxActiveX::GetPropDesc(int idx
) const
1318 if (idx
< 0 || idx
>= GetPropCount())
1319 throw exception("Property index out of bounds");
1321 return m_props
[idx
];
1324 const wxActiveX::PropX
& wxActiveX::GetPropDesc(const wxString
& name
) const
1326 NameMap::const_iterator it
= m_propNames
.find(name
);
1327 if (it
== m_propNames
.end())
1330 s
<< _T("property <") << name
<< _T("> not found");
1331 throw exception(s
.mb_str());
1334 return GetPropDesc(it
->second
);
1337 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(int idx
) const
1339 if (idx
< 0 || idx
>= GetMethodCount())
1340 throw exception("Method index out of bounds");
1343 return m_methods
[idx
];
1347 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(const wxString
& name
) const
1349 NameMap::const_iterator it
= m_methodNames
.find(name
);
1350 if (it
== m_methodNames
.end())
1353 s
<< _T("method <") << name
<< _T("> not found");
1354 throw exception(s
.mb_str());
1357 return GetMethodDesc(it
->second
);
1361 void wxActiveX::SetProp(MEMBERID name
, VARIANTARG
& value
)
1363 DISPID pids
[1] = {DISPID_PROPERTYPUT
};
1364 DISPPARAMS params
= {&value
, pids
, 1, 1};
1367 memset(&x
, 0, sizeof(x
));
1368 unsigned int argErr
= 0;
1370 HRESULT hr
= m_Dispatch
->Invoke(
1372 IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYPUT
,
1373 ¶ms
, NULL
, &x
, &argErr
);
1375 WXOLE_WARN(hr
, "Invoke Prop(...)");
1378 void wxActiveX::SetProp(const wxString
&name
, const wxVariant
&value
)
1380 const PropX
& prop
= GetPropDesc(name
);
1381 if (! prop
.CanSet())
1384 s
<< _T("property <") << name
<< _T("> is readonly");
1385 throw exception(s
.mb_str());
1388 VARIANT v
= {prop
.arg
.vt
};
1389 VariantToMSWVariant(value
, v
);
1390 SetProp(prop
.memid
, v
);
1391 VariantClear(&v
); // this releases any BSTR's etc
1394 VARIANT
wxActiveX::GetPropAsVariant(MEMBERID name
)
1399 DISPPARAMS params
= {NULL
, NULL
, 0, 0};
1402 memset(&x
, 0, sizeof(x
));
1403 unsigned int argErr
= 0;
1405 HRESULT hr
= m_Dispatch
->Invoke(
1407 IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYGET
,
1408 ¶ms
, &v
, &x
, &argErr
);
1410 WXOLE_WARN(hr
, "Invoke Prop(...)");
1415 VARIANT
wxActiveX::GetPropAsVariant(const wxString
& name
)
1417 const PropX
& prop
= GetPropDesc(name
);
1418 if (! prop
.CanGet())
1421 s
<< _T("property <") << name
<< _T("> is writeonly");
1422 throw exception(s
.mb_str());
1425 return GetPropAsVariant(prop
.memid
);
1428 wxVariant
wxActiveX::GetPropAsWxVariant(const wxString
& name
)
1430 VARIANT v
= GetPropAsVariant(name
);
1431 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BSTR
);
1432 if (! SUCCEEDED(hr
))
1433 throw exception("Unable to convert variant");
1436 MSWVariantToVariant(v
, wv
);
1443 wxString
wxActiveX::GetPropAsString(const wxString
& name
)
1445 VARIANT v
= GetPropAsVariant(name
);
1446 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BSTR
);
1447 if (! SUCCEEDED(hr
))
1448 throw exception("Unable to convert variant");
1450 wxString s
= v
.bstrVal
;
1456 char wxActiveX::GetPropAsChar(const wxString
& name
)
1458 VARIANT v
= GetPropAsVariant(name
);
1459 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_I1
);
1460 if (! SUCCEEDED(hr
))
1461 throw exception("Unable to convert variant");
1466 long wxActiveX::GetPropAsLong(const wxString
& name
)
1468 VARIANT v
= GetPropAsVariant(name
);
1469 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_I4
);
1470 if (! SUCCEEDED(hr
))
1471 throw exception("Unable to convert variant");
1476 bool wxActiveX::GetPropAsBool(const wxString
& name
)
1478 VARIANT v
= GetPropAsVariant(name
);
1479 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BOOL
);
1480 if (! SUCCEEDED(hr
))
1481 throw exception("Unable to convert variant");
1483 return v
.boolVal
!= 0;
1486 double wxActiveX::GetPropAsDouble(const wxString
& name
)
1488 VARIANT v
= GetPropAsVariant(name
);
1489 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_R8
);
1490 if (! SUCCEEDED(hr
))
1491 throw exception("Unable to convert variant");
1496 wxDateTime
wxActiveX::GetPropAsDateTime(const wxString
& name
)
1499 VARIANT v
= GetPropAsVariant(name
);
1501 if (! VariantToWxDateTime(v
, dt
))
1502 throw exception("Unable to convert variant to wxDateTime");
1507 void *wxActiveX::GetPropAsPointer(const wxString
& name
)
1509 VARIANT v
= GetPropAsVariant(name
);
1510 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BYREF
);
1511 if (! SUCCEEDED(hr
))
1512 throw exception("Unable to convert variant");
1520 VARIANT
wxActiveX::CallMethod(MEMBERID name
, VARIANTARG args
[], int argc
)
1522 DISPPARAMS pargs
= {args
, NULL
, argc
, 0};
1524 VariantInit(&retVal
);
1527 memset(&x
, 0, sizeof(x
));
1528 unsigned int argErr
= 0;
1530 HRESULT hr
= m_Dispatch
->Invoke(
1532 IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_METHOD
,
1533 &pargs
, &retVal
, &x
, &argErr
);
1535 WXOLE_WARN(hr
, "Invoke Method(...)");
1539 VARIANT
wxActiveX::CallMethod(const wxString
& name
, VARIANTARG args
[], int argc
)
1541 const FuncX
& func
= GetMethodDesc(name
);
1543 argc
= func
.params
.size();
1545 return CallMethod(func
.memid
, args
, argc
);
1549 wxVariant
wxActiveX::CallMethod(const wxString
& name
, wxVariant args
[], int nargs
)
1551 const FuncX
& func
= GetMethodDesc(name
);
1556 VARIANTARG
*vargs
= NULL
;
1558 nargs
= func
.params
.size();
1561 vargs
= new VARIANTARG
[nargs
];
1565 // init type of vargs
1566 for (int i
= 0; i
< nargs
; i
++)
1567 vargs
[nargs
- i
- 1].vt
= func
.params
[i
].vt
;
1570 for (i
= 0; i
< nargs
; i
++)
1571 VariantToMSWVariant(args
[i
], vargs
[nargs
- i
- 1]);
1574 VARIANT rv
= CallMethod(func
.memid
, vargs
, nargs
);
1576 // process any by ref params
1579 for (int i
= 0; i
< nargs
; i
++)
1581 VARIANTARG
& va
= vargs
[nargs
- i
- 1];
1582 const wxActiveX::ParamX
&px
= func
.params
[i
];
1586 wxVariant
& vx
= args
[i
];
1588 MSWVariantToVariant(va
, vx
);
1595 for (int i
= 0; i
< nargs
; i
++)
1596 VariantClear(&vargs
[i
]);
1602 MSWVariantToVariant(rv
, ret
);
1609 ///////////////////////////////////////////////
1611 HRESULT
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown
*events
)
1613 wxOleConnectionPoint cp
;
1614 DWORD adviseCookie
= 0;
1616 wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
);
1617 if (! cpContainer
.Ok())
1620 HRESULT hret
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef());
1621 if (! SUCCEEDED(hret
))
1624 hret
= cp
->Advise(events
, &adviseCookie
);
1626 if (SUCCEEDED(hret
))
1627 m_connections
.push_back(wxOleConnection(cp
, adviseCookie
));
1630 WXOLE_WARN(hret
, "ConnectAdvise");
1636 HRESULT
wxActiveX::AmbientPropertyChanged(DISPID dispid
)
1638 wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
);
1640 if (oleControl
.Ok())
1641 return oleControl
->OnAmbientPropertyChange(dispid
);
1646 #define HIMETRIC_PER_INCH 2540
1647 #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
1649 static void PixelsToHimetric(SIZEL
&sz
)
1651 static int logX
= 0;
1652 static int logY
= 0;
1657 HDC dc
= GetDC(NULL
);
1658 logX
= GetDeviceCaps(dc
, LOGPIXELSX
);
1659 logY
= GetDeviceCaps(dc
, LOGPIXELSY
);
1660 ReleaseDC(NULL
, dc
);
1663 #define HIMETRIC_INCH 2540
1664 #define CONVERT(x, logpixels) MulDiv(HIMETRIC_INCH, (x), (logpixels))
1666 sz
.cx
= CONVERT(sz
.cx
, logX
);
1667 sz
.cy
= CONVERT(sz
.cy
, logY
);
1670 #undef HIMETRIC_INCH
1674 void wxActiveX::OnSize(wxSizeEvent
& event
)
1677 GetClientSize(&w
, &h
);
1685 if (w
<= 0 && h
<= 0)
1688 // extents are in HIMETRIC units
1689 if (m_oleObject
.Ok())
1692 PixelsToHimetric(sz
);
1696 m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
);
1697 if (sz2
.cx
!= sz
.cx
|| sz
.cy
!= sz2
.cy
)
1698 m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
);
1701 if (m_oleInPlaceObject
.Ok())
1702 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
1705 void wxActiveX::OnPaint(wxPaintEvent
& event
)
1707 wxLogTrace(wxT(""),wxT("repainting activex win"));
1718 // Draw only when control is windowless or deactivated
1721 ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
);
1723 RECTL
*prcBounds
= (RECTL
*) &posRect
;
1724 m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
,
1725 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0);
1730 dc
.SetBrush(*wxRED_BRUSH
);
1731 dc
.DrawRectangle(0, 0, w
, h
);
1732 dc
.SetBrush(wxNullBrush
);
1738 void wxActiveX::OnMouse(wxMouseEvent
& event
)
1740 if (m_oleObjectHWND
== NULL
)
1742 wxLogTrace(wxT(""),wxT("no oleInPlaceObject"));
1747 wxLogTrace(wxT(""),wxT("mouse event"));
1751 LRESULT lResult
= 0;
1753 if (event
.m_metaDown
)
1754 wParam
|= MK_CONTROL
;
1755 if (event
.m_shiftDown
)
1757 if (event
.m_leftDown
)
1758 wParam
|= MK_LBUTTON
;
1759 if (event
.m_middleDown
)
1760 wParam
|= MK_MBUTTON
;
1761 if (event
.m_rightDown
)
1762 wParam
|= MK_RBUTTON
;
1763 lParam
= event
.m_x
<< 16;
1764 lParam
|= event
.m_y
;
1766 if (event
.LeftDown())
1767 msg
= WM_LBUTTONDOWN
;
1768 else if (event
.LeftDClick())
1769 msg
= WM_LBUTTONDBLCLK
;
1770 else if (event
.LeftUp())
1772 else if (event
.MiddleDown())
1773 msg
= WM_MBUTTONDOWN
;
1774 else if (event
.MiddleDClick())
1775 msg
= WM_MBUTTONDBLCLK
;
1776 else if (event
.MiddleUp())
1778 else if (event
.RightDown())
1779 msg
= WM_RBUTTONDOWN
;
1780 else if (event
.RightDClick())
1781 msg
= WM_RBUTTONDBLCLK
;
1782 else if (event
.RightUp())
1784 else if (event
.Moving() || event
.Dragging())
1790 wxLogTrace(wxT(""),wxT("no message"));
1791 event
.Skip(); return;
1794 if (!::SendMessage(m_oleObjectHWND
, msg
, wParam
, lParam
))
1796 wxLogTrace(wxT(""),wxT("msg not delivered"));
1801 wxLogTrace(wxT(""),wxT("msg sent"));
1804 bool wxActiveX::MSWTranslateMessage(WXMSG
*msg
){
1806 if (msg
->message
== WM_KEYDOWN
){
1807 HRESULT result
= m_oleInPlaceActiveObject
->TranslateAccelerator(msg
);
1808 return (result
== S_OK
);
1811 return wxWindow::MSWTranslateMessage(msg
);
1814 long wxActiveX::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
)
1816 if (m_oleObjectHWND
== NULL
)
1817 return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
);
1826 case WM_SYSDEADCHAR
:
1829 PostMessage(m_oleObjectHWND
, nMsg
, wParam
, lParam
);
1832 return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
);
1836 void wxActiveX::OnSetFocus(wxFocusEvent
& event
)
1838 if (m_oleInPlaceActiveObject
.Ok())
1839 m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
);
1842 void wxActiveX::OnKillFocus(wxFocusEvent
& event
)
1844 if (m_oleInPlaceActiveObject
.Ok())
1845 m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
);
1849 FrameSite::FrameSite(wxActiveX
* win
)
1852 m_bSupportsWindowlessActivation
= true;
1853 m_bInPlaceLocked
= false;
1854 m_bUIActive
= false;
1855 m_bInPlaceActive
= false;
1856 m_bWindowless
= false;
1858 m_nAmbientLocale
= 0;
1859 m_clrAmbientForeColor
= ::GetSysColor(COLOR_WINDOWTEXT
);
1860 m_clrAmbientBackColor
= ::GetSysColor(COLOR_WINDOW
);
1861 m_bAmbientShowHatching
= true;
1862 m_bAmbientShowGrabHandles
= true;
1863 m_bAmbientAppearance
= true;
1866 m_hWndParent
= (HWND
)m_window
->GetHWND();
1869 FrameSite::~FrameSite()
1876 HRESULT
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR
** rgszNames
, unsigned int cNames
,
1877 LCID lcid
, DISPID
* rgDispId
)
1879 WXOLE_TRACE("IDispatch::GetIDsOfNames");
1883 HRESULT
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1885 WXOLE_TRACE("IDispatch::GetTypeInfo");
1889 HRESULT
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
)
1891 WXOLE_TRACE("IDispatch::GetTypeInfoCount");
1895 HRESULT
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1896 WORD wFlags
, DISPPARAMS
* pDispParams
,
1897 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
,
1898 unsigned int * puArgErr
)
1900 WXOLE_TRACE("IDispatch::Invoke");
1902 if (!(wFlags
& DISPATCH_PROPERTYGET
))
1907 if (pVarResult
== NULL
)
1908 return E_INVALIDARG
;
1910 //The most common case is boolean, use as an initial type
1911 V_VT(pVarResult
) = VT_BOOL
;
1913 switch (dispIdMember
)
1915 case DISPID_AMBIENT_MESSAGEREFLECT
:
1916 WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT");
1917 V_BOOL(pVarResult
)= FALSE
;
1920 case DISPID_AMBIENT_DISPLAYASDEFAULT
:
1921 WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT");
1922 V_BOOL(pVarResult
)= TRUE
;
1925 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
1926 WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED");
1927 V_BOOL(pVarResult
) = TRUE
;
1931 case DISPID_AMBIENT_SILENT
:
1932 WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT");
1933 V_BOOL(pVarResult
)= TRUE
;
1936 case DISPID_AMBIENT_APPEARANCE
:
1937 pVarResult
->vt
= VT_BOOL
;
1938 pVarResult
->boolVal
= m_bAmbientAppearance
;
1941 case DISPID_AMBIENT_FORECOLOR
:
1942 pVarResult
->vt
= VT_I4
;
1943 pVarResult
->lVal
= (long) m_clrAmbientForeColor
;
1946 case DISPID_AMBIENT_BACKCOLOR
:
1947 pVarResult
->vt
= VT_I4
;
1948 pVarResult
->lVal
= (long) m_clrAmbientBackColor
;
1951 case DISPID_AMBIENT_LOCALEID
:
1952 pVarResult
->vt
= VT_I4
;
1953 pVarResult
->lVal
= (long) m_nAmbientLocale
;
1956 case DISPID_AMBIENT_USERMODE
:
1957 pVarResult
->vt
= VT_BOOL
;
1958 pVarResult
->boolVal
= m_window
->m_bAmbientUserMode
;
1961 case DISPID_AMBIENT_SHOWGRABHANDLES
:
1962 pVarResult
->vt
= VT_BOOL
;
1963 pVarResult
->boolVal
= m_bAmbientShowGrabHandles
;
1966 case DISPID_AMBIENT_SHOWHATCHING
:
1967 pVarResult
->vt
= VT_BOOL
;
1968 pVarResult
->boolVal
= m_bAmbientShowHatching
;
1972 return DISP_E_MEMBERNOTFOUND
;
1980 HRESULT
FrameSite::GetWindow(HWND
* phwnd
)
1982 WXOLE_TRACE("IOleWindow::GetWindow");
1984 return E_INVALIDARG
;
1985 (*phwnd
) = m_hWndParent
;
1989 HRESULT
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
)
1991 WXOLE_TRACE("IOleWindow::ContextSensitiveHelp");
1995 //IOleInPlaceUIWindow
1997 HRESULT
FrameSite::GetBorder(LPRECT lprectBorder
)
1999 WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder");
2000 if (lprectBorder
== NULL
)
2001 return E_INVALIDARG
;
2002 return INPLACE_E_NOTOOLSPACE
;
2005 HRESULT
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
)
2007 WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace");
2008 if (pborderwidths
== NULL
)
2009 return E_INVALIDARG
;
2010 return INPLACE_E_NOTOOLSPACE
;
2013 HRESULT
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
)
2015 WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace");
2019 HRESULT
FrameSite::SetActiveObject(IOleInPlaceActiveObject
*pActiveObject
, LPCOLESTR pszObjName
)
2021 WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject");
2024 pActiveObject
->AddRef();
2026 m_window
->m_oleInPlaceActiveObject
= pActiveObject
;
2032 HRESULT
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2034 WXOLE_TRACE("IOleInPlaceFrame::InsertMenus");
2038 HRESULT
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
)
2040 WXOLE_TRACE("IOleInPlaceFrame::SetMenu");
2044 HRESULT
FrameSite::RemoveMenus(HMENU hmenuShared
)
2046 WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus");
2050 HRESULT
FrameSite::SetStatusText(LPCOLESTR pszStatusText
)
2052 WXOLE_TRACE("IOleInPlaceFrame::SetStatusText");
2053 //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText);
2057 HRESULT
FrameSite::EnableModeless(BOOL fEnable
)
2059 WXOLE_TRACE("IOleInPlaceFrame::EnableModeless");
2063 HRESULT
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
)
2065 WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator");
2066 // TODO: send an event with this id
2067 if (m_window
->m_oleInPlaceActiveObject
.Ok())
2068 m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
);
2075 HRESULT
FrameSite::CanInPlaceActivate()
2077 WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate");
2081 HRESULT
FrameSite::OnInPlaceActivate()
2083 WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate");
2084 m_bInPlaceActive
= true;
2088 HRESULT
FrameSite::OnUIActivate()
2090 WXOLE_TRACE("IOleInPlaceSite::OnUIActivate");
2095 HRESULT
FrameSite::GetWindowContext(IOleInPlaceFrame
**ppFrame
,
2096 IOleInPlaceUIWindow
**ppDoc
,
2098 LPRECT lprcClipRect
,
2099 LPOLEINPLACEFRAMEINFO lpFrameInfo
)
2101 WXOLE_TRACE("IOleInPlaceSite::GetWindowContext");
2102 if (ppFrame
== NULL
|| ppDoc
== NULL
|| lprcPosRect
== NULL
||
2103 lprcClipRect
== NULL
|| lpFrameInfo
== NULL
)
2105 if (ppFrame
!= NULL
)
2109 return E_INVALIDARG
;
2112 HRESULT hr
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
);
2113 if (! SUCCEEDED(hr
))
2115 WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !");
2116 return E_UNEXPECTED
;
2119 hr
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
);
2120 if (! SUCCEEDED(hr
))
2122 WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !");
2123 (*ppFrame
)->Release();
2125 return E_UNEXPECTED
;
2129 m_window
->GetClientSize(&w
, &h
);
2132 lprcPosRect
->left
= lprcPosRect
->top
= 0;
2133 lprcPosRect
->right
= w
;
2134 lprcPosRect
->bottom
= h
;
2138 lprcClipRect
->left
= lprcClipRect
->top
= 0;
2139 lprcClipRect
->right
= w
;
2140 lprcClipRect
->bottom
= h
;
2143 memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
));
2144 lpFrameInfo
->cb
= sizeof(OLEINPLACEFRAMEINFO
);
2145 lpFrameInfo
->hwndFrame
= m_hWndParent
;
2150 HRESULT
FrameSite::Scroll(SIZE scrollExtent
)
2152 WXOLE_TRACE("IOleInPlaceSite::Scroll");
2156 HRESULT
FrameSite::OnUIDeactivate(BOOL fUndoable
)
2158 WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate");
2159 m_bUIActive
= false;
2163 HRESULT
FrameSite::OnInPlaceDeactivate()
2165 WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate");
2166 m_bInPlaceActive
= false;
2170 HRESULT
FrameSite::DiscardUndoState()
2172 WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState");
2176 HRESULT
FrameSite::DeactivateAndUndo()
2178 WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo");
2182 HRESULT
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
)
2184 WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange");
2185 if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
)
2186 m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
);
2193 HRESULT
FrameSite::OnInPlaceActivateEx(BOOL
* pfNoRedraw
, DWORD dwFlags
)
2195 WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx");
2196 OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
);
2198 (*pfNoRedraw
) = FALSE
;
2202 HRESULT
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
)
2204 WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx");
2205 OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
);
2209 HRESULT
FrameSite::RequestUIActivate()
2211 WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate");
2218 HRESULT
FrameSite::SaveObject()
2220 WXOLE_TRACE("IOleClientSite::SaveObject");
2224 const char *OleGetMonikerToStr(DWORD dwAssign
)
2228 case OLEGETMONIKER_ONLYIFTHERE
: return "OLEGETMONIKER_ONLYIFTHERE";
2229 case OLEGETMONIKER_FORCEASSIGN
: return "OLEGETMONIKER_FORCEASSIGN";
2230 case OLEGETMONIKER_UNASSIGN
: return "OLEGETMONIKER_UNASSIGN";
2231 case OLEGETMONIKER_TEMPFORUSER
: return "OLEGETMONIKER_TEMPFORUSER";
2232 default : return "Bad Enum";
2236 const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker
)
2238 switch(dwWhichMoniker
)
2240 case OLEWHICHMK_CONTAINER
: return "OLEWHICHMK_CONTAINER";
2241 case OLEWHICHMK_OBJREL
: return "OLEWHICHMK_OBJREL";
2242 case OLEWHICHMK_OBJFULL
: return "OLEWHICHMK_OBJFULL";
2243 default : return "Bad Enum";
2247 HRESULT
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
,
2250 WXOLE_TRACEOUT("IOleClientSite::GetMoniker(" << OleGetMonikerToStr(dwAssign
) << ", " << OleGetWhicMonikerStr(dwWhichMoniker
) << ")");
2257 HRESULT hr = CreateFileMoniker(L"e:\\dev\\wxie\\bug-zap.swf", ppmk);
2266 HRESULT
FrameSite::GetContainer(LPOLECONTAINER
* ppContainer
)
2268 WXOLE_TRACE("IOleClientSite::GetContainer");
2269 if (ppContainer
== NULL
)
2270 return E_INVALIDARG
;
2272 HRESULT hr
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
));
2273 wxASSERT(SUCCEEDED(hr
));
2278 HRESULT
FrameSite::ShowObject()
2280 WXOLE_TRACE("IOleClientSite::ShowObject");
2281 if (m_window
->m_oleObjectHWND
)
2282 ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
);
2286 HRESULT
FrameSite::OnShowWindow(BOOL fShow
)
2288 WXOLE_TRACE("IOleClientSite::OnShowWindow");
2292 HRESULT
FrameSite::RequestNewObjectLayout()
2294 WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout");
2298 // IParseDisplayName
2300 HRESULT
FrameSite::ParseDisplayName(IBindCtx
*pbc
, LPOLESTR pszDisplayName
,
2301 ULONG
*pchEaten
, IMoniker
**ppmkOut
)
2303 WXOLE_TRACE("IParseDisplayName::ParseDisplayName");
2309 HRESULT
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown
**ppenum
)
2311 WXOLE_TRACE("IOleContainer::EnumObjects");
2315 HRESULT
FrameSite::LockContainer(BOOL fLock
)
2317 WXOLE_TRACE("IOleContainer::LockContainer");
2324 HRESULT
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
,
2325 IBindCtx
* pbc
, REFIID riid
, void ** ppvObject
)
2327 WXOLE_TRACE("IOleItemContainer::GetObject");
2328 if (pszItem
== NULL
)
2329 return E_INVALIDARG
;
2330 if (ppvObject
== NULL
)
2331 return E_INVALIDARG
;
2334 return MK_E_NOOBJECT
;
2337 HRESULT
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx
* pbc
,
2338 REFIID riid
, void ** ppvStorage
)
2340 WXOLE_TRACE("IOleItemContainer::GetObjectStorage");
2341 if (pszItem
== NULL
)
2342 return E_INVALIDARG
;
2343 if (ppvStorage
== NULL
)
2344 return E_INVALIDARG
;
2347 return MK_E_NOOBJECT
;
2350 HRESULT
FrameSite::IsRunning(LPOLESTR pszItem
)
2352 WXOLE_TRACE("IOleItemContainer::IsRunning");
2353 if (pszItem
== NULL
)
2354 return E_INVALIDARG
;
2356 return MK_E_NOOBJECT
;
2363 HRESULT
FrameSite::OnControlInfoChanged()
2365 WXOLE_TRACE("IOleControlSite::OnControlInfoChanged");
2369 HRESULT
FrameSite::LockInPlaceActive(BOOL fLock
)
2371 WXOLE_TRACE("IOleControlSite::LockInPlaceActive");
2372 m_bInPlaceLocked
= (fLock
) ? true : false;
2376 HRESULT
FrameSite::GetExtendedControl(IDispatch
** ppDisp
)
2378 WXOLE_TRACE("IOleControlSite::GetExtendedControl");
2382 HRESULT
FrameSite::TransformCoords(POINTL
* pPtlHimetric
, POINTF
* pPtfContainer
, DWORD dwFlags
)
2384 WXOLE_TRACE("IOleControlSite::TransformCoords");
2387 if (pPtlHimetric
== NULL
)
2388 return E_INVALIDARG
;
2390 if (pPtfContainer
== NULL
)
2391 return E_INVALIDARG
;
2397 HRESULT
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
)
2399 WXOLE_TRACE("IOleControlSite::TranslateAccelerator");
2400 // TODO: send an event with this id
2404 HRESULT
FrameSite::OnFocus(BOOL fGotFocus
)
2406 WXOLE_TRACE("IOleControlSite::OnFocus");
2410 HRESULT
FrameSite::ShowPropertyFrame()
2412 WXOLE_TRACE("IOleControlSite::ShowPropertyFrame");
2418 HRESULT
FrameSite::QueryStatus(const GUID
* pguidCmdGroup
, ULONG cCmds
,
2419 OLECMD
* prgCmds
, OLECMDTEXT
* pCmdTet
)
2421 WXOLE_TRACE("IOleCommandTarget::QueryStatus");
2422 if (prgCmds
== NULL
) return E_INVALIDARG
;
2423 bool bCmdGroupFound
= false;
2425 for (ULONG nCmd
= 0; nCmd
< cCmds
; nCmd
++)
2427 // unsupported by default
2428 prgCmds
[nCmd
].cmdf
= 0;
2433 if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; }
2437 HRESULT
FrameSite::Exec(const GUID
* pguidCmdGroup
, DWORD nCmdID
,
2438 DWORD nCmdExecOpt
, VARIANTARG
* pVaIn
,
2439 VARIANTARG
* pVaOut
)
2441 WXOLE_TRACE("IOleCommandTarget::Exec");
2442 bool bCmdGroupFound
= false;
2444 if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; }
2445 return OLECMDERR_E_NOTSUPPORTED
;
2450 void STDMETHODCALLTYPE
FrameSite::OnDataChange(FORMATETC
* pFormatEtc
, STGMEDIUM
* pgStgMed
)
2452 WXOLE_TRACE("IAdviseSink::OnDataChange");
2455 void STDMETHODCALLTYPE
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
)
2457 WXOLE_TRACE("IAdviseSink::OnViewChange");
2458 // redraw the control
2461 void STDMETHODCALLTYPE
FrameSite::OnRename(IMoniker
* pmk
)
2463 WXOLE_TRACE("IAdviseSink::OnRename");
2466 void STDMETHODCALLTYPE
FrameSite::OnSave()
2468 WXOLE_TRACE("IAdviseSink::OnSave");
2471 void STDMETHODCALLTYPE
FrameSite::OnClose()
2473 WXOLE_TRACE("IAdviseSink::OnClose");
2476 /////////////////////////////////////////////
2478 HRESULT STDMETHODCALLTYPE
FrameSite::ActivateMe(
2479 /* [in] */ IOleDocumentView __RPC_FAR
*pViewToActivate
)
2481 wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch
*) this);
2482 if (!inPlaceSite
.Ok())
2485 if (pViewToActivate
)
2487 m_window
->m_docView
= pViewToActivate
;
2488 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
2492 wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
);
2496 HRESULT hr
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef());
2500 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
2503 m_window
->m_docView
->UIActivate(TRUE
);
2509 static IMalloc
*iMalloc
= NULL
;
2511 IMalloc
*wxOleInit::GetIMalloc()
2517 wxOleInit::wxOleInit()
2519 if (OleInitialize(NULL
) == S_OK
&& iMalloc
== NULL
)
2520 CoGetMalloc(1, &iMalloc
);
2525 wxOleInit::~wxOleInit()
2529 if (iMalloc
->Release() == 0)
2536 bool GetSysErrMessage(int err
, wxString
& s
)
2540 FORMAT_MESSAGE_FROM_SYSTEM
, NULL
,
2541 err
,0, buf
, sizeof(buf
), NULL
) == 0)
2544 buf
[sizeof(buf
) - 1] = 0;
2549 wxString
OLEHResultToString(HRESULT hr
)
2551 // try formatmessage
2553 if (GetSysErrMessage(hr
, err
))
2559 return wxEmptyString
;
2561 case CONNECT_E_CANNOTCONNECT
:
2562 return _T("Cannot connect to event interface (maybe not there ?) - see MSDN");
2564 case DISP_E_MEMBERNOTFOUND
:
2565 return _T("The requested member does not exist, or the call to Invoke tried to set the value of a read-only property.");
2567 case DISP_E_BADVARTYPE
:
2568 return _T("One of the parameters in rgvarg is not a valid variant type.");
2570 case DISP_E_BADPARAMCOUNT
:
2571 return _T("The number of elements provided to DISPPARAMS is different from the number of parameters accepted by the method or property");
2573 case DISP_E_EXCEPTION
:
2574 return _T("The application needs to raise an exception. In this case, the structure passed in pExcepInfo should be filled in.");
2576 case DISP_E_TYPEMISMATCH
:
2577 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.");
2579 case DISP_E_PARAMNOTOPTIONAL
:
2580 return _T("A required parameter was omitted.");
2582 case DISP_E_PARAMNOTFOUND
:
2583 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.");
2585 case OLECMDERR_E_UNKNOWNGROUP
:
2586 return _T("The pguidCmdGroup parameter is not NULL but does not specify a recognized command group.");
2588 case OLECMDERR_E_NOTSUPPORTED
:
2589 return _T("The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup.");
2591 case OLECMDERR_E_DISABLED
:
2592 return _T("The command identified by nCmdID is currently disabled and cannot be executed.");
2594 case OLECMDERR_E_NOHELP
:
2595 return _T("The caller has asked for help on the command identified by nCmdID, but no help is available.");
2597 case OLECMDERR_E_CANCELED
:
2598 return _T("The user canceled the execution of the command.");
2601 return _T("E_INVALIDARG");
2604 return _T("E_OUTOFMEMORY");
2607 return _T("E_NOINTERFACE");
2610 return _T("E_UNEXPECTED");
2612 case STG_E_INVALIDFLAG
:
2613 return _T("STG_E_INVALIDFLAG");
2616 return _T("E_FAIL");
2619 return _T("E_NOTIMPL");
2624 buf
.Printf(_T("Unknown - 0x%X"), hr
);
2630 // borrowed from src/msw/ole/oleutils.cpp
2631 wxString
GetIIDName(REFIID riid
)
2633 // an association between symbolic name and numeric value of an IID
2637 const wxChar
*szName
;
2640 // construct the table containing all known interfaces
2641 #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) }
2642 #define ADD_KNOWN_GUID(name) { &name, _T(#name) }
2644 static const KNOWN_IID aKnownIids
[] =
2646 ADD_KNOWN_IID(ServiceProvider
),
2647 ADD_KNOWN_IID(AdviseSink
),
2648 ADD_KNOWN_IID(AdviseSink2
),
2649 ADD_KNOWN_IID(BindCtx
),
2650 ADD_KNOWN_IID(ClassFactory
),
2651 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__)
2652 ADD_KNOWN_IID(ContinueCallback
),
2653 ADD_KNOWN_IID(EnumOleDocumentViews
),
2654 ADD_KNOWN_IID(OleCommandTarget
),
2655 ADD_KNOWN_IID(OleDocument
),
2656 ADD_KNOWN_IID(OleDocumentSite
),
2657 ADD_KNOWN_IID(OleDocumentView
),
2658 ADD_KNOWN_IID(Print
),
2660 ADD_KNOWN_IID(DataAdviseHolder
),
2661 ADD_KNOWN_IID(DataObject
),
2662 ADD_KNOWN_IID(Debug
),
2663 ADD_KNOWN_IID(DebugStream
),
2664 ADD_KNOWN_IID(DfReserved1
),
2665 ADD_KNOWN_IID(DfReserved2
),
2666 ADD_KNOWN_IID(DfReserved3
),
2667 ADD_KNOWN_IID(Dispatch
),
2668 ADD_KNOWN_IID(DropSource
),
2669 ADD_KNOWN_IID(DropTarget
),
2670 ADD_KNOWN_IID(EnumCallback
),
2671 ADD_KNOWN_IID(EnumFORMATETC
),
2672 ADD_KNOWN_IID(EnumGeneric
),
2673 ADD_KNOWN_IID(EnumHolder
),
2674 ADD_KNOWN_IID(EnumMoniker
),
2675 ADD_KNOWN_IID(EnumOLEVERB
),
2676 ADD_KNOWN_IID(EnumSTATDATA
),
2677 ADD_KNOWN_IID(EnumSTATSTG
),
2678 ADD_KNOWN_IID(EnumString
),
2679 ADD_KNOWN_IID(EnumUnknown
),
2680 ADD_KNOWN_IID(EnumVARIANT
),
2681 ADD_KNOWN_IID(ExternalConnection
),
2682 ADD_KNOWN_IID(InternalMoniker
),
2683 ADD_KNOWN_IID(LockBytes
),
2684 ADD_KNOWN_IID(Malloc
),
2685 ADD_KNOWN_IID(Marshal
),
2686 ADD_KNOWN_IID(MessageFilter
),
2687 ADD_KNOWN_IID(Moniker
),
2688 ADD_KNOWN_IID(OleAdviseHolder
),
2689 ADD_KNOWN_IID(OleCache
),
2690 ADD_KNOWN_IID(OleCache2
),
2691 ADD_KNOWN_IID(OleCacheControl
),
2692 ADD_KNOWN_IID(OleClientSite
),
2693 ADD_KNOWN_IID(OleContainer
),
2694 ADD_KNOWN_IID(OleInPlaceActiveObject
),
2695 ADD_KNOWN_IID(OleInPlaceFrame
),
2696 ADD_KNOWN_IID(OleInPlaceObject
),
2697 ADD_KNOWN_IID(OleInPlaceSite
),
2698 ADD_KNOWN_IID(OleInPlaceUIWindow
),
2699 ADD_KNOWN_IID(OleItemContainer
),
2700 ADD_KNOWN_IID(OleLink
),
2701 ADD_KNOWN_IID(OleManager
),
2702 ADD_KNOWN_IID(OleObject
),
2703 ADD_KNOWN_IID(OlePresObj
),
2704 ADD_KNOWN_IID(OleWindow
),
2705 ADD_KNOWN_IID(PSFactory
),
2706 ADD_KNOWN_IID(ParseDisplayName
),
2707 ADD_KNOWN_IID(Persist
),
2708 ADD_KNOWN_IID(PersistFile
),
2709 ADD_KNOWN_IID(PersistStorage
),
2710 ADD_KNOWN_IID(PersistStream
),
2711 ADD_KNOWN_IID(ProxyManager
),
2712 ADD_KNOWN_IID(RootStorage
),
2713 ADD_KNOWN_IID(RpcChannel
),
2714 ADD_KNOWN_IID(RpcProxy
),
2715 ADD_KNOWN_IID(RpcStub
),
2716 ADD_KNOWN_IID(RunnableObject
),
2717 ADD_KNOWN_IID(RunningObjectTable
),
2718 ADD_KNOWN_IID(StdMarshalInfo
),
2719 ADD_KNOWN_IID(Storage
),
2720 ADD_KNOWN_IID(Stream
),
2721 ADD_KNOWN_IID(StubManager
),
2722 ADD_KNOWN_IID(Unknown
),
2723 ADD_KNOWN_IID(ViewObject
),
2724 ADD_KNOWN_IID(ViewObject2
),
2725 ADD_KNOWN_GUID(IID_IDispatch
),
2726 ADD_KNOWN_GUID(IID_IWebBrowser
),
2727 ADD_KNOWN_GUID(IID_IWebBrowserApp
),
2728 ADD_KNOWN_GUID(IID_IWebBrowser2
),
2729 ADD_KNOWN_GUID(IID_IWebBrowser
),
2730 ADD_KNOWN_GUID(DIID_DWebBrowserEvents2
),
2731 ADD_KNOWN_GUID(DIID_DWebBrowserEvents
),
2734 // don't clobber preprocessor name space
2735 #undef ADD_KNOWN_IID
2736 #undef ADD_KNOWN_GUID
2738 // try to find the interface in the table
2739 for ( size_t ui
= 0; ui
< WXSIZEOF(aKnownIids
); ui
++ )
2741 if ( riid
== *aKnownIids
[ui
].pIid
)
2743 return aKnownIids
[ui
].szName
;
2747 // unknown IID, just transform to string
2748 LPOLESTR str
= NULL
;
2749 StringFromIID(riid
, &str
);
2757 return _T("StringFromIID() error");