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