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
)
312 ////////////////////////////////////////////////////////
314 FrameSite
*frame
= new FrameSite(this);
316 hret
= m_clientSite
.QueryInterface(IID_IOleClientSite
, (IDispatch
*) frame
);
317 wxCHECK_RET(SUCCEEDED(hret
), _T("m_clientSite.QueryInterface failed"));
319 wxAutoOleInterface
<IAdviseSink
> adviseSink(IID_IAdviseSink
, (IDispatch
*) frame
);
320 wxCHECK_RET(adviseSink
.Ok(), _T("adviseSink not Ok"));
323 // Create Object, get IUnknown interface
324 m_ActiveX
.CreateInstance(clsid
, IID_IUnknown
);
325 wxCHECK_RET(m_ActiveX
.Ok(), _T("m_ActiveX.CreateInstance failed"));
327 // Register object as active
328 unsigned long pdwRegister
;
329 hret
= RegisterActiveObject(m_ActiveX
, clsid
, ACTIVEOBJECT_WEAK
, &m_pdwRegister
);
330 WXOLE_WARN(hret
, "Unable to register object as active");
332 // Get Dispatch interface
333 hret
= m_Dispatch
.QueryInterface(IID_IDispatch
, m_ActiveX
);
334 WXOLE_WARN(hret
, "Unable to get dispatch interface");
339 // Get IOleObject interface
340 hret
= m_oleObject
.QueryInterface(IID_IOleObject
, m_ActiveX
);
341 wxCHECK_RET(SUCCEEDED(hret
), _("Unable to get IOleObject interface"));
343 // get IViewObject Interface
344 hret
= m_viewObject
.QueryInterface(IID_IViewObject
, m_ActiveX
);
345 wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IViewObject Interface"));
348 m_docAdviseCookie
= 0;
349 hret
= m_oleObject
->Advise(adviseSink
, &m_docAdviseCookie
);
350 WXOLE_WARN(hret
, "m_oleObject->Advise(adviseSink, &m_docAdviseCookie),\"Advise\")");
351 m_oleObject
->SetHostNames(L
"wxActiveXContainer", NULL
);
352 OleSetContainedObject(m_oleObject
, TRUE
);
356 // Get IOleInPlaceObject interface
357 hret
= m_oleInPlaceObject
.QueryInterface(IID_IOleInPlaceObject
, m_ActiveX
);
358 wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get IOleInPlaceObject interface"));
362 m_oleObject
->GetMiscStatus(DVASPECT_CONTENT
, &dwMiscStatus
);
363 wxCHECK_RET(SUCCEEDED(hret
), _T("Unable to get oleObject status"));
365 // set client site first ?
366 if (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
)
367 m_oleObject
->SetClientSite(m_clientSite
);
371 wxAutoOleInterface
<IPersistStreamInit
>
372 pPersistStreamInit(IID_IPersistStreamInit
, m_oleObject
);
374 if (pPersistStreamInit
.Ok())
376 hret
= pPersistStreamInit
->InitNew();
377 WXOLE_WARN(hret
, "CreateActiveX::pPersistStreamInit->InitNew()");
380 if (! (dwMiscStatus
& OLEMISC_SETCLIENTSITEFIRST
))
381 m_oleObject
->SetClientSite(m_clientSite
);
385 GetClientSize(&w
, &h
);
394 if (m_oleInPlaceObject
.Ok())
396 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
397 WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)");
399 ::SetActiveWindow(m_oleObjectHWND
);
403 if (! (dwMiscStatus
& OLEMISC_INVISIBLEATRUNTIME
))
405 if (w
> 0 && h
> 0 && m_oleInPlaceObject
.Ok())
406 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
408 hret
= m_oleObject
->DoVerb(OLEIVERB_INPLACEACTIVATE
, NULL
, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
);
409 hret
= m_oleObject
->DoVerb(OLEIVERB_SHOW
, 0, m_clientSite
, 0, (HWND
)GetHWND(), &posRect
);
412 if (! m_oleObjectHWND
&& m_oleInPlaceObject
.Ok())
414 hret
= m_oleInPlaceObject
->GetWindow(&m_oleObjectHWND
);
415 WXOLE_WARN(hret
, "m_oleInPlaceObject->GetWindow(&m_oleObjectHWND)");
420 ::SetActiveWindow(m_oleObjectHWND
);
421 ::ShowWindow(m_oleObjectHWND
, SW_SHOW
);
423 // Update by GBR to resize older controls
425 szEvent
.m_size
= wxSize(w
, h
) ;
426 GetEventHandler()->AddPendingEvent(szEvent
);
430 void wxActiveX::CreateActiveX(LPOLESTR progId
)
433 if (CLSIDFromProgID(progId
, &clsid
) != S_OK
)
436 CreateActiveX(clsid
);
439 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
440 // Case Insensitive Map of Event names to eventTypes
441 // created dynamically at run time in:
442 // EVT_ACTIVEX(eventName, id, fn)
443 // we map the pointer to them so that:
444 // const wxEventType& RegisterActiveXEvent(wxString eventName);
445 // can return a const reference, which is neccessary for event tables
446 // probably should use a wxWindows hash table here, but I'm lazy ...
447 typedef map
<wxString
, wxEventType
*, NS_wxActiveX::less_wxStringI
> ActiveXNamedEventMap
;
448 static ActiveXNamedEventMap sg_NamedEventMap
;
450 const wxEventType
& RegisterActiveXEvent(const wxChar
*eventName
)
452 wxString ev
= eventName
;
453 ActiveXNamedEventMap::iterator it
= sg_NamedEventMap
.find(ev
);
454 if (it
== sg_NamedEventMap
.end())
456 wxEventType
*et
= new wxEventType(wxNewEventType());
457 sg_NamedEventMap
[ev
] = et
;
462 return *(it
->second
);
466 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
467 // Map of Event DISPID's to eventTypes
468 // created dynamically at run time in:
469 // EVT_ACTIVEX(eventName, id, fn)
470 // we map the pointer to them so that:
471 // const wxEventType& RegisterActiveXEvent(wxString eventName);
472 // can return a const reference, which is neccessary for event tables
474 typedef map
<DISPID
, wxEventType
*> ActiveXDISPIDEventMap
;
475 static ActiveXDISPIDEventMap sg_dispIdEventMap
;
477 const wxEventType
& RegisterActiveXEvent(DISPID event
)
479 ActiveXDISPIDEventMap::iterator it
= sg_dispIdEventMap
.find(event
);
480 if (it
== sg_dispIdEventMap
.end())
482 wxEventType
*et
= new wxEventType(wxNewEventType());
483 sg_dispIdEventMap
[event
] = et
;
488 return *(it
->second
);
491 // one off class for automatic freeing of activeX eventtypes
492 class ActiveXEventMapFlusher
495 ~ActiveXEventMapFlusher()
498 ActiveXNamedEventMap::iterator it
= sg_NamedEventMap
.end();
499 while (it
!= sg_NamedEventMap
.end())
504 sg_NamedEventMap
.clear();
507 ActiveXDISPIDEventMap::iterator dit
= sg_dispIdEventMap
.end();
508 while (dit
!= sg_dispIdEventMap
.end())
513 sg_dispIdEventMap
.clear();
517 static ActiveXEventMapFlusher s_dummyActiveXEventMapFlusher
;
520 //////////////////////////////////////////////////////
521 VARTYPE
wxTypeToVType(const wxVariant
& v
)
523 wxString type
= v
.GetType();
524 if (type
== wxT("bool"))
526 else if (type
== wxT("char"))
528 else if (type
== wxT("datetime"))
530 else if (type
== wxT("double"))
532 else if (type
== wxT("list"))
534 else if (type
== wxT("long"))
536 else if (type
== wxT("string"))
538 else if (type
== wxT("stringlist"))
540 else if (type
== wxT("date"))
542 else if (type
== wxT("time"))
544 else if (type
== wxT("void*"))
545 return VT_VOID
| VT_BYREF
;
550 bool wxDateTimeToDATE(wxDateTime dt
, DATE
& d
)
553 memset(&st
, 0, sizeof(st
));
555 st
.wYear
= dt
.GetYear();
556 st
.wMonth
= dt
.GetMonth() + 1;
557 st
.wDay
= dt
.GetDay();
558 st
.wHour
= dt
.GetHour();
559 st
.wMinute
= dt
.GetMinute();
560 st
.wSecond
= dt
.GetSecond();
561 st
.wMilliseconds
= dt
.GetMillisecond();
562 return SystemTimeToVariantTime(&st
, &d
) != FALSE
;
565 bool wxDateTimeToVariant(wxDateTime dt
, VARIANTARG
& va
)
567 return wxDateTimeToDATE(dt
, va
.date
);
570 bool DATEToWxDateTime(DATE date
, wxDateTime
& dt
)
573 if (! VariantTimeToSystemTime(date
, &st
))
578 wxDateTime::Month(int(wxDateTime::Jan
) + st
.wMonth
- 1),
580 st
.wHour
, st
.wMinute
, st
.wSecond
, st
.wMilliseconds
);
585 bool VariantToWxDateTime(VARIANTARG va
, wxDateTime
& dt
)
587 HRESULT hr
= VariantChangeType(&va
, &va
, 0, VT_DATE
);
591 return DATEToWxDateTime(va
.date
, dt
);
594 bool MSWVariantToVariant(VARIANTARG
& va
, wxVariant
& vx
)
600 return false; // don't support arrays yet
613 return MSWVariantToVariant(*va
.pvarVal
, vx
);
617 VariantChangeType(&tmp
, &tmp
, 0, wxTypeToVType(vx
));
618 bool rc
= MSWVariantToVariant(tmp
, vx
);
627 vx
= (char) *va
.pbVal
;
636 vx
= (long) *va
.puiVal
;
638 vx
= (long) va
.uiVal
;
648 vx
= (long) *va
.pulVal
;
650 vx
= (long) va
.ulVal
;
672 vx
= (*va
.pboolVal
? true : false);
674 vx
= (va
.boolVal
? true : false);
679 return false; // what the hell is a CY ?
686 hr
= VarR8FromDec(va
.pdecVal
, &d
);
688 hr
= VarR8FromDec(&va
.decVal
, &d
);
691 return SUCCEEDED(hr
);
699 rc
= DATEToWxDateTime(*va
.pdate
, dt
);
701 rc
= VariantToWxDateTime(va
, dt
);
708 vx
= wxString(*va
.pbstrVal
);
710 vx
= wxString(va
.bstrVal
);
713 case VT_UNKNOWN
: // should do a custom wxVariantData for this
715 vx
= (void *) *va
.ppunkVal
;
717 vx
= (void *) va
.punkVal
;
720 case VT_DISPATCH
: // should do a custom wxVariantData for this
722 vx
= (void *) *va
.ppdispVal
;
724 vx
= (void *) va
.pdispVal
;
733 bool VariantToMSWVariant(const wxVariant
& vx
, VARIANTARG
& va
)
739 return false; // don't support arrays yet
751 return VariantToMSWVariant(vx
, *va
.pvarVal
);
754 va
.vt
= wxTypeToVType(vx
);
755 return VariantToMSWVariant(vx
, va
);
762 *va
.pbVal
= (char) vx
;
771 *va
.puiVal
= (long) vx
;
773 va
.uiVal
= (long) vx
;
783 *va
.pulVal
= (long) vx
;
785 va
.ulVal
= (long) vx
;
792 *va
.pfltVal
= (double) vx
;
794 va
.fltVal
= (double) vx
;
800 *va
.pdblVal
= (double) vx
;
802 va
.dblVal
= (double) vx
;
807 *va
.pboolVal
= ((bool) vx
) ? TRUE
: FALSE
;
809 va
.boolVal
= ((bool) vx
) ? TRUE
: FALSE
;
813 return false; // what the hell is a CY ?
817 return SUCCEEDED(VarDecFromR8(vx
, va
.pdecVal
));
819 return SUCCEEDED(VarDecFromR8(vx
, &va
.decVal
));
823 return wxDateTimeToDATE(vx
, *va
.pdate
);
825 return wxDateTimeToVariant(vx
,va
);
829 *va
.pbstrVal
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
));
831 va
.bstrVal
= SysAllocString(vx
.GetString().wc_str(wxConvUTF8
));
834 case VT_UNKNOWN
: // should do a custom wxVariantData for this
836 *va
.ppunkVal
= (IUnknown
*) (void *) vx
;
838 va
.punkVal
= (IUnknown
*) (void *) vx
;
841 case VT_DISPATCH
: // should do a custom wxVariantData for this
843 *va
.ppdispVal
= (IDispatch
*) (void *) vx
;
845 va
.pdispVal
= (IDispatch
*) (void *) vx
;
853 IMPLEMENT_CLASS(wxActiveXEvent
, wxCommandEvent
)
855 class wxActiveXEvents
: public IDispatch
858 DECLARE_OLE_UNKNOWN(wxActiveXEvents
);
861 wxActiveX
*m_activeX
;
865 friend bool wxActiveXEventsInterface(wxActiveXEvents
*self
, REFIID iid
, void **_interface
, const char *&desc
);
868 wxActiveXEvents(wxActiveX
*ax
) : m_activeX(ax
), m_haveCustomId(false) {}
869 wxActiveXEvents(wxActiveX
*ax
, REFIID iid
) : m_activeX(ax
), m_haveCustomId(true), m_customId(iid
) {}
870 virtual ~wxActiveXEvents()
875 STDMETHODIMP
GetIDsOfNames(REFIID r
, OLECHAR
** o
, unsigned int i
, LCID l
, DISPID
* d
)
880 STDMETHODIMP
GetTypeInfo(unsigned int i
, LCID l
, ITypeInfo
** t
)
885 STDMETHODIMP
GetTypeInfoCount(unsigned int* i
)
891 void DispatchEvent(wxActiveX::FuncX
&func
, const wxEventType
& eventType
, DISPPARAMS
* pDispParams
)
893 wxActiveXEvent event
;
894 event
.SetId(m_activeX
->GetId());
895 event
.SetEventType(eventType
);
896 event
.m_params
.NullList();
897 event
.m_params
.SetName(func
.name
);
903 // sometimes the pDispParams does not match the param info for a activex control
904 int nArg
= wxMin(func
.params
.size(), pDispParams
->cArgs
);
905 for (int i
= nArg
- 1; i
>= 0; i
--)
907 VARIANTARG
& va
= pDispParams
->rgvarg
[i
];
908 wxActiveX::ParamX
&px
= func
.params
[nArg
- i
- 1];
912 MSWVariantToVariant(va
, vx
);
913 event
.m_params
.Append(vx
);
919 int nArg
= wxMin(func
.params
.size(), pDispParams
->cArgs
);
920 m_activeX
->GetEventHandler()->ProcessEvent(event
);
921 for (int i
= 0; i
< nArg
; i
++)
923 VARIANTARG
& va
= pDispParams
->rgvarg
[i
];
924 wxActiveX::ParamX
&px
= func
.params
[nArg
- i
- 1];
928 wxVariant
& vx
= event
.m_params
[nArg
- i
- 1];
930 VariantToMSWVariant(vx
, va
);
935 m_activeX
->GetEventHandler()->AddPendingEvent(event
);
939 STDMETHODIMP
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
940 WORD wFlags
, DISPPARAMS
* pDispParams
,
941 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
,
942 unsigned int * puArgErr
)
944 if (wFlags
& (DISPATCH_PROPERTYGET
| DISPATCH_PROPERTYPUT
| DISPATCH_PROPERTYPUTREF
))
949 // find event for dispid
950 wxActiveX::MemberIdMap::iterator mit
= m_activeX
->m_eventMemberIds
.find((MEMBERID
) dispIdMember
);
951 if (mit
== m_activeX
->m_eventMemberIds
.end())
955 int midx
= mit
->second
;
956 if (midx
< 0 || midx
>= m_activeX
->GetEventCount())
959 wxActiveX::FuncX
&func
= m_activeX
->m_events
[midx
];
962 // try to find dispid event
963 ActiveXDISPIDEventMap::iterator dit
= sg_dispIdEventMap
.find(dispIdMember
);
964 if (dit
!= sg_dispIdEventMap
.end())
967 DispatchEvent(func
, *(dit
->second
), pDispParams
);
972 ActiveXNamedEventMap::iterator nit
= sg_NamedEventMap
.find(func
.name
);
973 if (nit
== sg_NamedEventMap
.end())
977 DispatchEvent(func
, *(nit
->second
), pDispParams
);
982 bool wxActiveXEventsInterface(wxActiveXEvents
*self
, REFIID iid
, void **_interface
, const char *&desc
)
984 if (self
->m_haveCustomId
&& IsEqualIID(iid
, self
->m_customId
))
986 WXOLE_TRACE("Found Custom Dispatch Interface");
987 *_interface
= (IUnknown
*) (IDispatch
*) self
;
988 desc
= "Custom Dispatch Interface";
995 DEFINE_OLE_TABLE(wxActiveXEvents
)
996 OLE_IINTERFACE(IUnknown
)
997 OLE_INTERFACE(IID_IDispatch
, IDispatch
)
998 OLE_INTERFACE_CUSTOM(wxActiveXEventsInterface
)
1001 wxString
wxActiveXEvent::EventName()
1003 return m_params
.GetName();
1006 int wxActiveXEvent::ParamCount() const
1008 return m_params
.GetCount();
1011 wxString
wxActiveXEvent::ParamType(int idx
)
1013 wxASSERT(idx
>= 0 && idx
< m_params
.GetCount());
1015 return m_params
[idx
].GetType();
1018 wxString
wxActiveXEvent::ParamName(int idx
)
1020 wxASSERT(idx
>= 0 && idx
< m_params
.GetCount());
1022 return m_params
[idx
].GetName();
1025 static wxVariant nullVar
;
1027 wxVariant
& wxActiveXEvent::operator[] (int idx
)
1029 wxASSERT(idx
>= 0 && idx
< ParamCount());
1031 return m_params
[idx
];
1034 wxVariant
& wxActiveXEvent::operator[] (wxString name
)
1036 for (int i
= 0; i
< m_params
.GetCount(); i
++)
1038 if (name
.CmpNoCase(m_params
[i
].GetName()) == 0)
1042 wxString err
= _T("wxActiveXEvent::operator[] invalid name <") + name
+ _T(">");
1043 err
+= _T("\r\nValid Names = :\r\n");
1044 for (i
= 0; i
< m_params
.GetCount(); i
++)
1046 err
+= m_params
[i
].GetName();
1050 wxASSERT_MSG(false, err
);
1055 void wxActiveX::GetTypeInfo()
1058 We are currently only interested in the IDispatch interface
1059 to the control. For dual interfaces (TypeKind = TKIND_INTERFACE)
1060 we should drill down through the inheritance
1061 (using TYPEATTR->cImplTypes) and GetRefTypeOfImplType(n)
1062 and retrieve all the func names etc that way, then generate a C++
1065 But we don't do this and probably never will, so if we have a DUAL
1066 interface then we query for the IDispatch
1067 via GetRefTypeOfImplType(-1).
1072 // get type info via class info
1073 wxAutoOleInterface
<IProvideClassInfo
> classInfo(IID_IProvideClassInfo
, m_ActiveX
);
1074 if (! classInfo
.Ok())
1078 wxAutoOleInterface
<ITypeInfo
> typeInfo
;
1079 hret
= classInfo
->GetClassInfo(typeInfo
.GetRef());
1080 if (! typeInfo
.Ok())
1084 TYPEATTR
*ta
= NULL
;
1085 hret
= typeInfo
->GetTypeAttr(&ta
);
1089 // this should be a TKIND_COCLASS
1090 wxASSERT(ta
->typekind
== TKIND_COCLASS
);
1092 // iterate contained interfaces
1093 for (int i
= 0; i
< ta
->cImplTypes
; i
++)
1097 // get dispatch type info handle
1098 hret
= typeInfo
->GetRefTypeOfImplType(i
, &rt
);
1099 if (! SUCCEEDED(hret
))
1102 // get dispatch type info interface
1103 wxAutoOleInterface
<ITypeInfo
> ti
;
1104 hret
= typeInfo
->GetRefTypeInfo(rt
, ti
.GetRef());
1108 // check if default event sink
1109 bool defInterface
= false;
1110 bool defEventSink
= false;
1111 int impTypeFlags
= 0;
1112 typeInfo
->GetImplTypeFlags(i
, &impTypeFlags
);
1114 if (impTypeFlags
& IMPLTYPEFLAG_FDEFAULT
)
1116 if (impTypeFlags
& IMPLTYPEFLAG_FSOURCE
)
1118 WXOLE_TRACEOUT("Default Event Sink");
1119 defEventSink
= true;
1120 if (impTypeFlags
& IMPLTYPEFLAG_FDEFAULTVTABLE
)
1122 WXOLE_TRACEOUT("*ERROR* - Default Event Sink is via vTable");
1123 defEventSink
= false;
1128 WXOLE_TRACEOUT("Default Interface");
1129 defInterface
= true;
1135 GetTypeInfo(ti
, defInterface
, defEventSink
);
1140 typeInfo
->ReleaseTypeAttr(ta
);
1143 void ElemDescToParam(const ELEMDESC
& ed
, wxActiveX::ParamX
& param
)
1145 param
.flags
= ed
.idldesc
.wIDLFlags
;
1146 param
.vt
= ed
.tdesc
.vt
;
1147 param
.isPtr
= (param
.vt
== VT_PTR
);
1148 param
.isSafeArray
= (param
.vt
== VT_SAFEARRAY
);
1149 if (param
.isPtr
|| param
.isSafeArray
)
1150 param
.vt
= ed
.tdesc
.lptdesc
->vt
;
1153 void wxActiveX::GetTypeInfo(ITypeInfo
*ti
, bool defInterface
, bool defEventSink
)
1155 // wxAutoOleInterface<> assumes a ref has already been added
1157 wxAutoOleInterface
<ITypeInfo
> typeInfo(ti
);
1160 TYPEATTR
*ta
= NULL
;
1161 HRESULT hret
= typeInfo
->GetTypeAttr(&ta
);
1165 if (ta
->typekind
== TKIND_DISPATCH
)
1167 WXOLE_TRACEOUT("GUID = " << GetIIDName(ta
->guid
).c_str());
1171 wxActiveXEvents
*disp
= new wxActiveXEvents(this, ta
->guid
);
1172 ConnectAdvise(ta
->guid
, disp
);
1176 // Get Function Names
1177 for (int i
= 0; i
< ta
->cFuncs
; i
++)
1179 FUNCDESC FAR
*fd
= NULL
;
1181 hret
= typeInfo
->GetFuncDesc(i
, &fd
);
1185 BSTR anames
[1] = {NULL
};
1188 hret
= typeInfo
->GetNames(fd
->memid
, anames
, 1, &n
);
1192 wxString name
= anames
[0];
1194 WXOLE_TRACEOUT("Name " << i
<< " = " << name
.c_str());
1195 SysFreeString(anames
[0]);
1197 if (defInterface
|| defEventSink
)
1201 func
.memid
= fd
->memid
;
1202 func
.hasOut
= false;
1205 unsigned int maxPNames
= fd
->cParams
+ 1;
1206 unsigned int nPNames
= 0;
1207 BSTR
*pnames
= new BSTR
[maxPNames
];
1209 hret
= typeInfo
->GetNames(fd
->memid
, pnames
, maxPNames
, &nPNames
);
1212 if (fd
->cParams
< int(nPNames
))
1215 SysFreeString(pnames
[0]);
1219 ElemDescToParam(fd
->elemdescFunc
, func
.retType
);
1220 for (int p
= 0; p
< fd
->cParams
; p
++)
1224 ElemDescToParam(fd
->lprgelemdescParam
[p
], param
);
1226 param
.name
= pnames
[pbase
+ p
];
1227 SysFreeString(pnames
[pbase
+ p
]);
1229 param
.isOptional
= (p
> fd
->cParams
- fd
->cParamsOpt
);
1231 func
.hasOut
|= (param
.IsOut() || param
.isPtr
);
1232 func
.params
.push_back(param
);
1238 m_events
.push_back(func
);
1239 m_eventMemberIds
[fd
->memid
] = m_events
.size() - 1;
1243 if (fd
->invkind
== INVOKE_FUNC
)
1245 m_methods
.push_back(func
);
1246 m_methodNames
[func
.name
] = m_methods
.size() - 1;
1250 NameMap::iterator it
= m_propNames
.find(func
.name
);
1252 if (it
== m_propNames
.end())
1254 m_props
.push_back(PropX());
1255 idx
= m_props
.size() - 1;
1256 m_propNames
[func
.name
] = idx
;
1257 m_props
[idx
].name
= func
.name
;
1258 m_props
[idx
].memid
= func
.memid
;
1264 if (fd
->invkind
== INVOKE_PROPERTYGET
)
1265 m_props
[idx
].type
= func
.retType
;
1266 else if (func
.params
.size() > 0)
1268 m_props
[idx
].arg
= func
.params
[0];
1269 m_props
[idx
].putByRef
= (fd
->invkind
== INVOKE_PROPERTYPUTREF
);
1276 typeInfo
->ReleaseFuncDesc(fd
);
1280 typeInfo
->ReleaseTypeAttr(ta
);
1283 ///////////////////////////////////////////////
1284 // Type Info exposure
1285 const wxActiveX::FuncX
& wxActiveX::GetEventDesc(int idx
) const
1287 wxASSERT(idx
>= 0 && idx
< GetEventCount());
1289 return m_events
[idx
];
1292 const wxActiveX::PropX
& wxActiveX::GetPropDesc(int idx
) const
1294 if (idx
< 0 || idx
>= GetPropCount())
1295 throw exception("Property index out of bounds");
1297 return m_props
[idx
];
1300 const wxActiveX::PropX
& wxActiveX::GetPropDesc(const wxString
& name
) const
1302 NameMap::const_iterator it
= m_propNames
.find(name
);
1303 if (it
== m_propNames
.end())
1306 s
<< _T("property <") << name
<< _T("> not found");
1307 throw exception(s
.mb_str());
1310 return GetPropDesc(it
->second
);
1313 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(int idx
) const
1315 if (idx
< 0 || idx
>= GetMethodCount())
1316 throw exception("Method index out of bounds");
1319 return m_methods
[idx
];
1323 const wxActiveX::FuncX
& wxActiveX::GetMethodDesc(const wxString
& name
) const
1325 NameMap::const_iterator it
= m_methodNames
.find(name
);
1326 if (it
== m_methodNames
.end())
1329 s
<< _T("method <") << name
<< _T("> not found");
1330 throw exception(s
.mb_str());
1333 return GetMethodDesc(it
->second
);
1337 void wxActiveX::SetProp(MEMBERID name
, VARIANTARG
& value
)
1339 DISPID pids
[1] = {DISPID_PROPERTYPUT
};
1340 DISPPARAMS params
= {&value
, pids
, 1, 1};
1343 memset(&x
, 0, sizeof(x
));
1344 unsigned int argErr
= 0;
1346 HRESULT hr
= m_Dispatch
->Invoke(
1348 IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYPUT
,
1349 ¶ms
, NULL
, &x
, &argErr
);
1351 WXOLE_WARN(hr
, "Invoke Prop(...)");
1354 void wxActiveX::SetProp(const wxString
&name
, const wxVariant
&value
)
1356 const PropX
& prop
= GetPropDesc(name
);
1357 if (! prop
.CanSet())
1360 s
<< _T("property <") << name
<< _T("> is readonly");
1361 throw exception(s
.mb_str());
1364 VARIANT v
= {prop
.arg
.vt
};
1365 VariantToMSWVariant(value
, v
);
1366 SetProp(prop
.memid
, v
);
1367 VariantClear(&v
); // this releases any BSTR's etc
1370 VARIANT
wxActiveX::GetPropAsVariant(MEMBERID name
)
1375 DISPPARAMS params
= {NULL
, NULL
, 0, 0};
1378 memset(&x
, 0, sizeof(x
));
1379 unsigned int argErr
= 0;
1381 HRESULT hr
= m_Dispatch
->Invoke(
1383 IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_PROPERTYGET
,
1384 ¶ms
, &v
, &x
, &argErr
);
1386 WXOLE_WARN(hr
, "Invoke Prop(...)");
1391 VARIANT
wxActiveX::GetPropAsVariant(const wxString
& name
)
1393 const PropX
& prop
= GetPropDesc(name
);
1394 if (! prop
.CanGet())
1397 s
<< _T("property <") << name
<< _T("> is writeonly");
1398 throw exception(s
.mb_str());
1401 return GetPropAsVariant(prop
.memid
);
1404 wxVariant
wxActiveX::GetPropAsWxVariant(const wxString
& name
)
1406 VARIANT v
= GetPropAsVariant(name
);
1407 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BSTR
);
1408 if (! SUCCEEDED(hr
))
1409 throw exception("Unable to convert variant");
1412 MSWVariantToVariant(v
, wv
);
1419 wxString
wxActiveX::GetPropAsString(const wxString
& name
)
1421 VARIANT v
= GetPropAsVariant(name
);
1422 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BSTR
);
1423 if (! SUCCEEDED(hr
))
1424 throw exception("Unable to convert variant");
1426 wxString s
= v
.bstrVal
;
1432 char wxActiveX::GetPropAsChar(const wxString
& name
)
1434 VARIANT v
= GetPropAsVariant(name
);
1435 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_I1
);
1436 if (! SUCCEEDED(hr
))
1437 throw exception("Unable to convert variant");
1442 long wxActiveX::GetPropAsLong(const wxString
& name
)
1444 VARIANT v
= GetPropAsVariant(name
);
1445 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_I4
);
1446 if (! SUCCEEDED(hr
))
1447 throw exception("Unable to convert variant");
1452 bool wxActiveX::GetPropAsBool(const wxString
& name
)
1454 VARIANT v
= GetPropAsVariant(name
);
1455 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BOOL
);
1456 if (! SUCCEEDED(hr
))
1457 throw exception("Unable to convert variant");
1459 return v
.boolVal
!= 0;
1462 double wxActiveX::GetPropAsDouble(const wxString
& name
)
1464 VARIANT v
= GetPropAsVariant(name
);
1465 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_R8
);
1466 if (! SUCCEEDED(hr
))
1467 throw exception("Unable to convert variant");
1472 wxDateTime
wxActiveX::GetPropAsDateTime(const wxString
& name
)
1475 VARIANT v
= GetPropAsVariant(name
);
1477 if (! VariantToWxDateTime(v
, dt
))
1478 throw exception("Unable to convert variant to wxDateTime");
1483 void *wxActiveX::GetPropAsPointer(const wxString
& name
)
1485 VARIANT v
= GetPropAsVariant(name
);
1486 HRESULT hr
= VariantChangeType(&v
, &v
, 0, VT_BYREF
);
1487 if (! SUCCEEDED(hr
))
1488 throw exception("Unable to convert variant");
1496 VARIANT
wxActiveX::CallMethod(MEMBERID name
, VARIANTARG args
[], int argc
)
1498 DISPPARAMS pargs
= {args
, NULL
, argc
, 0};
1500 VariantInit(&retVal
);
1503 memset(&x
, 0, sizeof(x
));
1504 unsigned int argErr
= 0;
1506 HRESULT hr
= m_Dispatch
->Invoke(
1508 IID_NULL
, LOCALE_USER_DEFAULT
, DISPATCH_METHOD
,
1509 &pargs
, &retVal
, &x
, &argErr
);
1511 WXOLE_WARN(hr
, "Invoke Method(...)");
1515 VARIANT
wxActiveX::CallMethod(const wxString
& name
, VARIANTARG args
[], int argc
)
1517 const FuncX
& func
= GetMethodDesc(name
);
1519 argc
= func
.params
.size();
1521 return CallMethod(func
.memid
, args
, argc
);
1525 wxVariant
wxActiveX::CallMethod(const wxString
& name
, wxVariant args
[], int nargs
)
1527 const FuncX
& func
= GetMethodDesc(name
);
1532 VARIANTARG
*vargs
= NULL
;
1534 nargs
= func
.params
.size();
1537 vargs
= new VARIANTARG
[nargs
];
1541 // init type of vargs
1542 for (int i
= 0; i
< nargs
; i
++)
1543 vargs
[nargs
- i
- 1].vt
= func
.params
[i
].vt
;
1546 for (i
= 0; i
< nargs
; i
++)
1547 VariantToMSWVariant(args
[i
], vargs
[nargs
- i
- 1]);
1550 VARIANT rv
= CallMethod(func
.memid
, vargs
, nargs
);
1552 // process any by ref params
1555 for (int i
= 0; i
< nargs
; i
++)
1557 VARIANTARG
& va
= vargs
[nargs
- i
- 1];
1558 const wxActiveX::ParamX
&px
= func
.params
[i
];
1562 wxVariant
& vx
= args
[i
];
1564 MSWVariantToVariant(va
, vx
);
1571 for (int i
= 0; i
< nargs
; i
++)
1572 VariantClear(&vargs
[i
]);
1578 MSWVariantToVariant(rv
, ret
);
1585 ///////////////////////////////////////////////
1587 HRESULT
wxActiveX::ConnectAdvise(REFIID riid
, IUnknown
*events
)
1589 wxOleConnectionPoint cp
;
1590 DWORD adviseCookie
= 0;
1592 wxAutoOleInterface
<IConnectionPointContainer
> cpContainer(IID_IConnectionPointContainer
, m_ActiveX
);
1593 if (! cpContainer
.Ok())
1596 HRESULT hret
= cpContainer
->FindConnectionPoint(riid
, cp
.GetRef());
1597 if (! SUCCEEDED(hret
))
1600 hret
= cp
->Advise(events
, &adviseCookie
);
1602 if (SUCCEEDED(hret
))
1603 m_connections
.push_back(wxOleConnection(cp
, adviseCookie
));
1606 WXOLE_WARN(hret
, "ConnectAdvise");
1612 HRESULT
wxActiveX::AmbientPropertyChanged(DISPID dispid
)
1614 wxAutoOleInterface
<IOleControl
> oleControl(IID_IOleControl
, m_oleObject
);
1616 if (oleControl
.Ok())
1617 return oleControl
->OnAmbientPropertyChange(dispid
);
1622 #define HIMETRIC_PER_INCH 2540
1623 #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
1625 static void PixelsToHimetric(SIZEL
&sz
)
1627 static int logX
= 0;
1628 static int logY
= 0;
1633 HDC dc
= GetDC(NULL
);
1634 logX
= GetDeviceCaps(dc
, LOGPIXELSX
);
1635 logY
= GetDeviceCaps(dc
, LOGPIXELSY
);
1636 ReleaseDC(NULL
, dc
);
1639 #define HIMETRIC_INCH 2540
1640 #define CONVERT(x, logpixels) MulDiv(HIMETRIC_INCH, (x), (logpixels))
1642 sz
.cx
= CONVERT(sz
.cx
, logX
);
1643 sz
.cy
= CONVERT(sz
.cy
, logY
);
1646 #undef HIMETRIC_INCH
1650 void wxActiveX::OnSize(wxSizeEvent
& event
)
1653 GetClientSize(&w
, &h
);
1661 if (w
<= 0 && h
<= 0)
1664 // extents are in HIMETRIC units
1665 if (m_oleObject
.Ok())
1668 PixelsToHimetric(sz
);
1672 m_oleObject
->GetExtent(DVASPECT_CONTENT
, &sz2
);
1673 if (sz2
.cx
!= sz
.cx
|| sz
.cy
!= sz2
.cy
)
1674 m_oleObject
->SetExtent(DVASPECT_CONTENT
, &sz
);
1677 if (m_oleInPlaceObject
.Ok())
1678 m_oleInPlaceObject
->SetObjectRects(&posRect
, &posRect
);
1681 void wxActiveX::OnPaint(wxPaintEvent
& event
)
1683 wxLogTrace(wxT(""),wxT("repainting activex win"));
1694 // Draw only when control is windowless or deactivated
1697 ::RedrawWindow(m_oleObjectHWND
, NULL
, NULL
, RDW_INTERNALPAINT
);
1699 RECTL
*prcBounds
= (RECTL
*) &posRect
;
1700 m_viewObject
->Draw(DVASPECT_CONTENT
, -1, NULL
, NULL
, NULL
,
1701 (HDC
)dc
.GetHDC(), prcBounds
, NULL
, NULL
, 0);
1706 dc
.SetBrush(*wxRED_BRUSH
);
1707 dc
.DrawRectangle(0, 0, w
, h
);
1708 dc
.SetBrush(wxNullBrush
);
1714 void wxActiveX::OnMouse(wxMouseEvent
& event
)
1716 if (m_oleObjectHWND
== NULL
)
1718 wxLogTrace(wxT(""),wxT("no oleInPlaceObject"));
1723 wxLogTrace(wxT(""),wxT("mouse event"));
1727 LRESULT lResult
= 0;
1729 if (event
.m_metaDown
)
1730 wParam
|= MK_CONTROL
;
1731 if (event
.m_shiftDown
)
1733 if (event
.m_leftDown
)
1734 wParam
|= MK_LBUTTON
;
1735 if (event
.m_middleDown
)
1736 wParam
|= MK_MBUTTON
;
1737 if (event
.m_rightDown
)
1738 wParam
|= MK_RBUTTON
;
1739 lParam
= event
.m_x
<< 16;
1740 lParam
|= event
.m_y
;
1742 if (event
.LeftDown())
1743 msg
= WM_LBUTTONDOWN
;
1744 else if (event
.LeftDClick())
1745 msg
= WM_LBUTTONDBLCLK
;
1746 else if (event
.LeftUp())
1748 else if (event
.MiddleDown())
1749 msg
= WM_MBUTTONDOWN
;
1750 else if (event
.MiddleDClick())
1751 msg
= WM_MBUTTONDBLCLK
;
1752 else if (event
.MiddleUp())
1754 else if (event
.RightDown())
1755 msg
= WM_RBUTTONDOWN
;
1756 else if (event
.RightDClick())
1757 msg
= WM_RBUTTONDBLCLK
;
1758 else if (event
.RightUp())
1760 else if (event
.Moving() || event
.Dragging())
1766 wxLogTrace(wxT(""),wxT("no message"));
1767 event
.Skip(); return;
1770 if (!::SendMessage(m_oleObjectHWND
, msg
, wParam
, lParam
))
1772 wxLogTrace(wxT(""),wxT("msg not delivered"));
1777 wxLogTrace(wxT(""),wxT("msg sent"));
1780 long wxActiveX::MSWWindowProc(WXUINT nMsg
, WXWPARAM wParam
, WXLPARAM lParam
)
1782 if (m_oleObjectHWND
== NULL
)
1783 return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
);
1792 case WM_SYSDEADCHAR
:
1795 PostMessage(m_oleObjectHWND
, nMsg
, wParam
, lParam
);
1798 return wxWindow::MSWWindowProc(nMsg
, wParam
, lParam
);
1802 void wxActiveX::OnSetFocus(wxFocusEvent
& event
)
1804 if (m_oleInPlaceActiveObject
.Ok())
1805 m_oleInPlaceActiveObject
->OnFrameWindowActivate(TRUE
);
1808 void wxActiveX::OnKillFocus(wxFocusEvent
& event
)
1810 if (m_oleInPlaceActiveObject
.Ok())
1811 m_oleInPlaceActiveObject
->OnFrameWindowActivate(FALSE
);
1815 FrameSite::FrameSite(wxActiveX
* win
)
1818 m_bSupportsWindowlessActivation
= true;
1819 m_bInPlaceLocked
= false;
1820 m_bUIActive
= false;
1821 m_bInPlaceActive
= false;
1822 m_bWindowless
= false;
1824 m_nAmbientLocale
= 0;
1825 m_clrAmbientForeColor
= ::GetSysColor(COLOR_WINDOWTEXT
);
1826 m_clrAmbientBackColor
= ::GetSysColor(COLOR_WINDOW
);
1827 m_bAmbientShowHatching
= true;
1828 m_bAmbientShowGrabHandles
= true;
1829 m_bAmbientAppearance
= true;
1832 m_hWndParent
= (HWND
)m_window
->GetHWND();
1835 FrameSite::~FrameSite()
1842 HRESULT
FrameSite::GetIDsOfNames(REFIID riid
, OLECHAR
** rgszNames
, unsigned int cNames
,
1843 LCID lcid
, DISPID
* rgDispId
)
1845 WXOLE_TRACE("IDispatch::GetIDsOfNames");
1849 HRESULT
FrameSite::GetTypeInfo(unsigned int iTInfo
, LCID lcid
, ITypeInfo
** ppTInfo
)
1851 WXOLE_TRACE("IDispatch::GetTypeInfo");
1855 HRESULT
FrameSite::GetTypeInfoCount(unsigned int * pcTInfo
)
1857 WXOLE_TRACE("IDispatch::GetTypeInfoCount");
1861 HRESULT
FrameSite::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1862 WORD wFlags
, DISPPARAMS
* pDispParams
,
1863 VARIANT
* pVarResult
, EXCEPINFO
* pExcepInfo
,
1864 unsigned int * puArgErr
)
1866 WXOLE_TRACE("IDispatch::Invoke");
1868 if (!(wFlags
& DISPATCH_PROPERTYGET
))
1873 if (pVarResult
== NULL
)
1874 return E_INVALIDARG
;
1876 //The most common case is boolean, use as an initial type
1877 V_VT(pVarResult
) = VT_BOOL
;
1879 switch (dispIdMember
)
1881 case DISPID_AMBIENT_MESSAGEREFLECT
:
1882 WXOLE_TRACE("Invoke::DISPID_AMBIENT_MESSAGEREFLECT");
1883 V_BOOL(pVarResult
)= FALSE
;
1886 case DISPID_AMBIENT_DISPLAYASDEFAULT
:
1887 WXOLE_TRACE("Invoke::DISPID_AMBIENT_DISPLAYASDEFAULT");
1888 V_BOOL(pVarResult
)= TRUE
;
1891 case DISPID_AMBIENT_OFFLINEIFNOTCONNECTED
:
1892 WXOLE_TRACE("Invoke::DISPID_AMBIENT_OFFLINEIFNOTCONNECTED");
1893 V_BOOL(pVarResult
) = TRUE
;
1897 case DISPID_AMBIENT_SILENT
:
1898 WXOLE_TRACE("Invoke::DISPID_AMBIENT_SILENT");
1899 V_BOOL(pVarResult
)= TRUE
;
1902 case DISPID_AMBIENT_APPEARANCE
:
1903 pVarResult
->vt
= VT_BOOL
;
1904 pVarResult
->boolVal
= m_bAmbientAppearance
;
1907 case DISPID_AMBIENT_FORECOLOR
:
1908 pVarResult
->vt
= VT_I4
;
1909 pVarResult
->lVal
= (long) m_clrAmbientForeColor
;
1912 case DISPID_AMBIENT_BACKCOLOR
:
1913 pVarResult
->vt
= VT_I4
;
1914 pVarResult
->lVal
= (long) m_clrAmbientBackColor
;
1917 case DISPID_AMBIENT_LOCALEID
:
1918 pVarResult
->vt
= VT_I4
;
1919 pVarResult
->lVal
= (long) m_nAmbientLocale
;
1922 case DISPID_AMBIENT_USERMODE
:
1923 pVarResult
->vt
= VT_BOOL
;
1924 pVarResult
->boolVal
= m_window
->m_bAmbientUserMode
;
1927 case DISPID_AMBIENT_SHOWGRABHANDLES
:
1928 pVarResult
->vt
= VT_BOOL
;
1929 pVarResult
->boolVal
= m_bAmbientShowGrabHandles
;
1932 case DISPID_AMBIENT_SHOWHATCHING
:
1933 pVarResult
->vt
= VT_BOOL
;
1934 pVarResult
->boolVal
= m_bAmbientShowHatching
;
1938 return DISP_E_MEMBERNOTFOUND
;
1946 HRESULT
FrameSite::GetWindow(HWND
* phwnd
)
1948 WXOLE_TRACE("IOleWindow::GetWindow");
1950 return E_INVALIDARG
;
1951 (*phwnd
) = m_hWndParent
;
1955 HRESULT
FrameSite::ContextSensitiveHelp(BOOL fEnterMode
)
1957 WXOLE_TRACE("IOleWindow::ContextSensitiveHelp");
1961 //IOleInPlaceUIWindow
1963 HRESULT
FrameSite::GetBorder(LPRECT lprectBorder
)
1965 WXOLE_TRACE("IOleInPlaceUIWindow::GetBorder");
1966 if (lprectBorder
== NULL
)
1967 return E_INVALIDARG
;
1968 return INPLACE_E_NOTOOLSPACE
;
1971 HRESULT
FrameSite::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths
)
1973 WXOLE_TRACE("IOleInPlaceUIWindow::RequestBorderSpace");
1974 if (pborderwidths
== NULL
)
1975 return E_INVALIDARG
;
1976 return INPLACE_E_NOTOOLSPACE
;
1979 HRESULT
FrameSite::SetBorderSpace(LPCBORDERWIDTHS pborderwidths
)
1981 WXOLE_TRACE("IOleInPlaceUIWindow::SetBorderSpace");
1985 HRESULT
FrameSite::SetActiveObject(IOleInPlaceActiveObject
*pActiveObject
, LPCOLESTR pszObjName
)
1987 WXOLE_TRACE("IOleInPlaceUIWindow::SetActiveObject");
1990 pActiveObject
->AddRef();
1992 m_window
->m_oleInPlaceActiveObject
= pActiveObject
;
1998 HRESULT
FrameSite::InsertMenus(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2000 WXOLE_TRACE("IOleInPlaceFrame::InsertMenus");
2004 HRESULT
FrameSite::SetMenu(HMENU hmenuShared
, HOLEMENU holemenu
, HWND hwndActiveObject
)
2006 WXOLE_TRACE("IOleInPlaceFrame::SetMenu");
2010 HRESULT
FrameSite::RemoveMenus(HMENU hmenuShared
)
2012 WXOLE_TRACE("IOleInPlaceFrame::RemoveMenus");
2016 HRESULT
FrameSite::SetStatusText(LPCOLESTR pszStatusText
)
2018 WXOLE_TRACE("IOleInPlaceFrame::SetStatusText");
2019 //((wxFrame*)wxGetApp().GetTopWindow())->GetStatusBar()->SetStatusText(pszStatusText);
2023 HRESULT
FrameSite::EnableModeless(BOOL fEnable
)
2025 WXOLE_TRACE("IOleInPlaceFrame::EnableModeless");
2029 HRESULT
FrameSite::TranslateAccelerator(LPMSG lpmsg
, WORD wID
)
2031 WXOLE_TRACE("IOleInPlaceFrame::TranslateAccelerator");
2032 // TODO: send an event with this id
2033 if (m_window
->m_oleInPlaceActiveObject
.Ok())
2034 m_window
->m_oleInPlaceActiveObject
->TranslateAccelerator(lpmsg
);
2041 HRESULT
FrameSite::CanInPlaceActivate()
2043 WXOLE_TRACE("IOleInPlaceSite::CanInPlaceActivate");
2047 HRESULT
FrameSite::OnInPlaceActivate()
2049 WXOLE_TRACE("IOleInPlaceSite::OnInPlaceActivate");
2050 m_bInPlaceActive
= true;
2054 HRESULT
FrameSite::OnUIActivate()
2056 WXOLE_TRACE("IOleInPlaceSite::OnUIActivate");
2061 HRESULT
FrameSite::GetWindowContext(IOleInPlaceFrame
**ppFrame
,
2062 IOleInPlaceUIWindow
**ppDoc
,
2064 LPRECT lprcClipRect
,
2065 LPOLEINPLACEFRAMEINFO lpFrameInfo
)
2067 WXOLE_TRACE("IOleInPlaceSite::GetWindowContext");
2068 if (ppFrame
== NULL
|| ppDoc
== NULL
|| lprcPosRect
== NULL
||
2069 lprcClipRect
== NULL
|| lpFrameInfo
== NULL
)
2071 if (ppFrame
!= NULL
)
2075 return E_INVALIDARG
;
2078 HRESULT hr
= QueryInterface(IID_IOleInPlaceFrame
, (void **) ppFrame
);
2079 if (! SUCCEEDED(hr
))
2081 WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceFrame Error !");
2082 return E_UNEXPECTED
;
2085 hr
= QueryInterface(IID_IOleInPlaceUIWindow
, (void **) ppDoc
);
2086 if (! SUCCEEDED(hr
))
2088 WXOLE_TRACE("IOleInPlaceSite::IOleInPlaceUIWindow Error !");
2089 (*ppFrame
)->Release();
2091 return E_UNEXPECTED
;
2095 m_window
->GetClientSize(&w
, &h
);
2098 lprcPosRect
->left
= lprcPosRect
->top
= 0;
2099 lprcPosRect
->right
= w
;
2100 lprcPosRect
->bottom
= h
;
2104 lprcClipRect
->left
= lprcClipRect
->top
= 0;
2105 lprcClipRect
->right
= w
;
2106 lprcClipRect
->bottom
= h
;
2109 memset(lpFrameInfo
, 0, sizeof(OLEINPLACEFRAMEINFO
));
2110 lpFrameInfo
->cb
= sizeof(OLEINPLACEFRAMEINFO
);
2111 lpFrameInfo
->hwndFrame
= m_hWndParent
;
2116 HRESULT
FrameSite::Scroll(SIZE scrollExtent
)
2118 WXOLE_TRACE("IOleInPlaceSite::Scroll");
2122 HRESULT
FrameSite::OnUIDeactivate(BOOL fUndoable
)
2124 WXOLE_TRACE("IOleInPlaceSite::OnUIDeactivate");
2125 m_bUIActive
= false;
2129 HRESULT
FrameSite::OnInPlaceDeactivate()
2131 WXOLE_TRACE("IOleInPlaceSite::OnInPlaceDeactivate");
2132 m_bInPlaceActive
= false;
2136 HRESULT
FrameSite::DiscardUndoState()
2138 WXOLE_TRACE("IOleInPlaceSite::DiscardUndoState");
2142 HRESULT
FrameSite::DeactivateAndUndo()
2144 WXOLE_TRACE("IOleInPlaceSite::DeactivateAndUndo");
2148 HRESULT
FrameSite::OnPosRectChange(LPCRECT lprcPosRect
)
2150 WXOLE_TRACE("IOleInPlaceSite::OnPosRectChange");
2151 if (m_window
->m_oleInPlaceObject
.Ok() && lprcPosRect
)
2152 m_window
->m_oleInPlaceObject
->SetObjectRects(lprcPosRect
, lprcPosRect
);
2159 HRESULT
FrameSite::OnInPlaceActivateEx(BOOL
* pfNoRedraw
, DWORD dwFlags
)
2161 WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceActivateEx");
2162 OleLockRunning(m_window
->m_ActiveX
, TRUE
, FALSE
);
2164 (*pfNoRedraw
) = FALSE
;
2168 HRESULT
FrameSite::OnInPlaceDeactivateEx(BOOL fNoRedraw
)
2170 WXOLE_TRACE("IOleInPlaceSiteEx::OnInPlaceDeactivateEx");
2171 OleLockRunning(m_window
->m_ActiveX
, FALSE
, FALSE
);
2175 HRESULT
FrameSite::RequestUIActivate()
2177 WXOLE_TRACE("IOleInPlaceSiteEx::RequestUIActivate");
2184 HRESULT
FrameSite::SaveObject()
2186 WXOLE_TRACE("IOleClientSite::SaveObject");
2190 const char *OleGetMonikerToStr(DWORD dwAssign
)
2194 case OLEGETMONIKER_ONLYIFTHERE
: return "OLEGETMONIKER_ONLYIFTHERE";
2195 case OLEGETMONIKER_FORCEASSIGN
: return "OLEGETMONIKER_FORCEASSIGN";
2196 case OLEGETMONIKER_UNASSIGN
: return "OLEGETMONIKER_UNASSIGN";
2197 case OLEGETMONIKER_TEMPFORUSER
: return "OLEGETMONIKER_TEMPFORUSER";
2198 default : return "Bad Enum";
2202 const char *OleGetWhicMonikerStr(DWORD dwWhichMoniker
)
2204 switch(dwWhichMoniker
)
2206 case OLEWHICHMK_CONTAINER
: return "OLEWHICHMK_CONTAINER";
2207 case OLEWHICHMK_OBJREL
: return "OLEWHICHMK_OBJREL";
2208 case OLEWHICHMK_OBJFULL
: return "OLEWHICHMK_OBJFULL";
2209 default : return "Bad Enum";
2213 HRESULT
FrameSite::GetMoniker(DWORD dwAssign
, DWORD dwWhichMoniker
,
2216 WXOLE_TRACEOUT("IOleClientSite::GetMoniker(" << OleGetMonikerToStr(dwAssign
) << ", " << OleGetWhicMonikerStr(dwWhichMoniker
) << ")");
2223 HRESULT hr = CreateFileMoniker(L"e:\\dev\\wxie\\bug-zap.swf", ppmk);
2232 HRESULT
FrameSite::GetContainer(LPOLECONTAINER
* ppContainer
)
2234 WXOLE_TRACE("IOleClientSite::GetContainer");
2235 if (ppContainer
== NULL
)
2236 return E_INVALIDARG
;
2238 HRESULT hr
= QueryInterface(IID_IOleContainer
, (void**)(ppContainer
));
2239 wxASSERT(SUCCEEDED(hr
));
2244 HRESULT
FrameSite::ShowObject()
2246 WXOLE_TRACE("IOleClientSite::ShowObject");
2247 if (m_window
->m_oleObjectHWND
)
2248 ::ShowWindow(m_window
->m_oleObjectHWND
, SW_SHOW
);
2252 HRESULT
FrameSite::OnShowWindow(BOOL fShow
)
2254 WXOLE_TRACE("IOleClientSite::OnShowWindow");
2258 HRESULT
FrameSite::RequestNewObjectLayout()
2260 WXOLE_TRACE("IOleClientSite::RequestNewObjectLayout");
2264 // IParseDisplayName
2266 HRESULT
FrameSite::ParseDisplayName(IBindCtx
*pbc
, LPOLESTR pszDisplayName
,
2267 ULONG
*pchEaten
, IMoniker
**ppmkOut
)
2269 WXOLE_TRACE("IParseDisplayName::ParseDisplayName");
2275 HRESULT
FrameSite::EnumObjects(DWORD grfFlags
, IEnumUnknown
**ppenum
)
2277 WXOLE_TRACE("IOleContainer::EnumObjects");
2281 HRESULT
FrameSite::LockContainer(BOOL fLock
)
2283 WXOLE_TRACE("IOleContainer::LockContainer");
2290 HRESULT
FrameSite::GetObject(LPOLESTR pszItem
, DWORD dwSpeedNeeded
,
2291 IBindCtx
* pbc
, REFIID riid
, void ** ppvObject
)
2293 WXOLE_TRACE("IOleItemContainer::GetObject");
2294 if (pszItem
== NULL
)
2295 return E_INVALIDARG
;
2296 if (ppvObject
== NULL
)
2297 return E_INVALIDARG
;
2300 return MK_E_NOOBJECT
;
2303 HRESULT
FrameSite::GetObjectStorage(LPOLESTR pszItem
, IBindCtx
* pbc
,
2304 REFIID riid
, void ** ppvStorage
)
2306 WXOLE_TRACE("IOleItemContainer::GetObjectStorage");
2307 if (pszItem
== NULL
)
2308 return E_INVALIDARG
;
2309 if (ppvStorage
== NULL
)
2310 return E_INVALIDARG
;
2313 return MK_E_NOOBJECT
;
2316 HRESULT
FrameSite::IsRunning(LPOLESTR pszItem
)
2318 WXOLE_TRACE("IOleItemContainer::IsRunning");
2319 if (pszItem
== NULL
)
2320 return E_INVALIDARG
;
2322 return MK_E_NOOBJECT
;
2329 HRESULT
FrameSite::OnControlInfoChanged()
2331 WXOLE_TRACE("IOleControlSite::OnControlInfoChanged");
2335 HRESULT
FrameSite::LockInPlaceActive(BOOL fLock
)
2337 WXOLE_TRACE("IOleControlSite::LockInPlaceActive");
2338 m_bInPlaceLocked
= (fLock
) ? true : false;
2342 HRESULT
FrameSite::GetExtendedControl(IDispatch
** ppDisp
)
2344 WXOLE_TRACE("IOleControlSite::GetExtendedControl");
2348 HRESULT
FrameSite::TransformCoords(POINTL
* pPtlHimetric
, POINTF
* pPtfContainer
, DWORD dwFlags
)
2350 WXOLE_TRACE("IOleControlSite::TransformCoords");
2353 if (pPtlHimetric
== NULL
)
2354 return E_INVALIDARG
;
2356 if (pPtfContainer
== NULL
)
2357 return E_INVALIDARG
;
2363 HRESULT
FrameSite::TranslateAccelerator(LPMSG pMsg
, DWORD grfModifiers
)
2365 WXOLE_TRACE("IOleControlSite::TranslateAccelerator");
2366 // TODO: send an event with this id
2370 HRESULT
FrameSite::OnFocus(BOOL fGotFocus
)
2372 WXOLE_TRACE("IOleControlSite::OnFocus");
2376 HRESULT
FrameSite::ShowPropertyFrame()
2378 WXOLE_TRACE("IOleControlSite::ShowPropertyFrame");
2384 HRESULT
FrameSite::QueryStatus(const GUID
* pguidCmdGroup
, ULONG cCmds
,
2385 OLECMD
* prgCmds
, OLECMDTEXT
* pCmdTet
)
2387 WXOLE_TRACE("IOleCommandTarget::QueryStatus");
2388 if (prgCmds
== NULL
) return E_INVALIDARG
;
2389 bool bCmdGroupFound
= false;
2391 for (ULONG nCmd
= 0; nCmd
< cCmds
; nCmd
++)
2393 // unsupported by default
2394 prgCmds
[nCmd
].cmdf
= 0;
2399 if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; }
2403 HRESULT
FrameSite::Exec(const GUID
* pguidCmdGroup
, DWORD nCmdID
,
2404 DWORD nCmdExecOpt
, VARIANTARG
* pVaIn
,
2405 VARIANTARG
* pVaOut
)
2407 WXOLE_TRACE("IOleCommandTarget::Exec");
2408 bool bCmdGroupFound
= false;
2410 if (!bCmdGroupFound
) { OLECMDERR_E_UNKNOWNGROUP
; }
2411 return OLECMDERR_E_NOTSUPPORTED
;
2416 void STDMETHODCALLTYPE
FrameSite::OnDataChange(FORMATETC
* pFormatEtc
, STGMEDIUM
* pgStgMed
)
2418 WXOLE_TRACE("IAdviseSink::OnDataChange");
2421 void STDMETHODCALLTYPE
FrameSite::OnViewChange(DWORD dwAspect
, LONG lIndex
)
2423 WXOLE_TRACE("IAdviseSink::OnViewChange");
2424 // redraw the control
2427 void STDMETHODCALLTYPE
FrameSite::OnRename(IMoniker
* pmk
)
2429 WXOLE_TRACE("IAdviseSink::OnRename");
2432 void STDMETHODCALLTYPE
FrameSite::OnSave()
2434 WXOLE_TRACE("IAdviseSink::OnSave");
2437 void STDMETHODCALLTYPE
FrameSite::OnClose()
2439 WXOLE_TRACE("IAdviseSink::OnClose");
2442 /////////////////////////////////////////////
2444 HRESULT STDMETHODCALLTYPE
FrameSite::ActivateMe(
2445 /* [in] */ IOleDocumentView __RPC_FAR
*pViewToActivate
)
2447 wxAutoOleInterface
<IOleInPlaceSite
> inPlaceSite(IID_IOleInPlaceSite
, (IDispatch
*) this);
2448 if (!inPlaceSite
.Ok())
2451 if (pViewToActivate
)
2453 m_window
->m_docView
= pViewToActivate
;
2454 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
2458 wxAutoOleInterface
<IOleDocument
> oleDoc(IID_IOleDocument
, m_window
->m_oleObject
);
2462 HRESULT hr
= oleDoc
->CreateView(inPlaceSite
, NULL
, 0, m_window
->m_docView
.GetRef());
2466 m_window
->m_docView
->SetInPlaceSite(inPlaceSite
);
2469 m_window
->m_docView
->UIActivate(TRUE
);
2475 static IMalloc
*iMalloc
= NULL
;
2477 IMalloc
*wxOleInit::GetIMalloc()
2483 wxOleInit::wxOleInit()
2485 if (OleInitialize(NULL
) == S_OK
&& iMalloc
== NULL
)
2486 CoGetMalloc(1, &iMalloc
);
2491 wxOleInit::~wxOleInit()
2495 if (iMalloc
->Release() == 0)
2502 bool GetSysErrMessage(int err
, wxString
& s
)
2506 FORMAT_MESSAGE_FROM_SYSTEM
, NULL
,
2507 err
,0, buf
, sizeof(buf
), NULL
) == 0)
2510 buf
[sizeof(buf
) - 1] = 0;
2515 wxString
OLEHResultToString(HRESULT hr
)
2517 // try formatmessage
2519 if (GetSysErrMessage(hr
, err
))
2525 return wxEmptyString
;
2527 case CONNECT_E_CANNOTCONNECT
:
2528 return _T("Cannot connect to event interface (maybe not there ?) - see MSDN");
2530 case DISP_E_MEMBERNOTFOUND
:
2531 return _T("The requested member does not exist, or the call to Invoke tried to set the value of a read-only property.");
2533 case DISP_E_BADVARTYPE
:
2534 return _T("One of the parameters in rgvarg is not a valid variant type.");
2536 case DISP_E_BADPARAMCOUNT
:
2537 return _T("The number of elements provided to DISPPARAMS is different from the number of parameters accepted by the method or property");
2539 case DISP_E_EXCEPTION
:
2540 return _T("The application needs to raise an exception. In this case, the structure passed in pExcepInfo should be filled in.");
2542 case DISP_E_TYPEMISMATCH
:
2543 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.");
2545 case DISP_E_PARAMNOTOPTIONAL
:
2546 return _T("A required parameter was omitted.");
2548 case DISP_E_PARAMNOTFOUND
:
2549 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.");
2551 case OLECMDERR_E_UNKNOWNGROUP
:
2552 return _T("The pguidCmdGroup parameter is not NULL but does not specify a recognized command group.");
2554 case OLECMDERR_E_NOTSUPPORTED
:
2555 return _T("The nCmdID parameter is not a valid command in the group identified by pguidCmdGroup.");
2557 case OLECMDERR_E_DISABLED
:
2558 return _T("The command identified by nCmdID is currently disabled and cannot be executed.");
2560 case OLECMDERR_E_NOHELP
:
2561 return _T("The caller has asked for help on the command identified by nCmdID, but no help is available.");
2563 case OLECMDERR_E_CANCELED
:
2564 return _T("The user canceled the execution of the command.");
2567 return _T("E_INVALIDARG");
2570 return _T("E_OUTOFMEMORY");
2573 return _T("E_NOINTERFACE");
2576 return _T("E_UNEXPECTED");
2578 case STG_E_INVALIDFLAG
:
2579 return _T("STG_E_INVALIDFLAG");
2582 return _T("E_FAIL");
2585 return _T("E_NOTIMPL");
2590 buf
.Printf(_T("Unknown - 0x%X"), hr
);
2596 // borrowed from src/msw/ole/oleutils.cpp
2597 wxString
GetIIDName(REFIID riid
)
2599 // an association between symbolic name and numeric value of an IID
2603 const wxChar
*szName
;
2606 // construct the table containing all known interfaces
2607 #define ADD_KNOWN_IID(name) { &IID_I##name, _T(#name) }
2608 #define ADD_KNOWN_GUID(name) { &name, _T(#name) }
2610 static const KNOWN_IID aKnownIids
[] =
2612 ADD_KNOWN_IID(ServiceProvider
),
2613 ADD_KNOWN_IID(AdviseSink
),
2614 ADD_KNOWN_IID(AdviseSink2
),
2615 ADD_KNOWN_IID(BindCtx
),
2616 ADD_KNOWN_IID(ClassFactory
),
2617 #if ( !defined( __VISUALC__) || (__VISUALC__!=1010) ) && !defined(__MWERKS__)
2618 ADD_KNOWN_IID(ContinueCallback
),
2619 ADD_KNOWN_IID(EnumOleDocumentViews
),
2620 ADD_KNOWN_IID(OleCommandTarget
),
2621 ADD_KNOWN_IID(OleDocument
),
2622 ADD_KNOWN_IID(OleDocumentSite
),
2623 ADD_KNOWN_IID(OleDocumentView
),
2624 ADD_KNOWN_IID(Print
),
2626 ADD_KNOWN_IID(DataAdviseHolder
),
2627 ADD_KNOWN_IID(DataObject
),
2628 ADD_KNOWN_IID(Debug
),
2629 ADD_KNOWN_IID(DebugStream
),
2630 ADD_KNOWN_IID(DfReserved1
),
2631 ADD_KNOWN_IID(DfReserved2
),
2632 ADD_KNOWN_IID(DfReserved3
),
2633 ADD_KNOWN_IID(Dispatch
),
2634 ADD_KNOWN_IID(DropSource
),
2635 ADD_KNOWN_IID(DropTarget
),
2636 ADD_KNOWN_IID(EnumCallback
),
2637 ADD_KNOWN_IID(EnumFORMATETC
),
2638 ADD_KNOWN_IID(EnumGeneric
),
2639 ADD_KNOWN_IID(EnumHolder
),
2640 ADD_KNOWN_IID(EnumMoniker
),
2641 ADD_KNOWN_IID(EnumOLEVERB
),
2642 ADD_KNOWN_IID(EnumSTATDATA
),
2643 ADD_KNOWN_IID(EnumSTATSTG
),
2644 ADD_KNOWN_IID(EnumString
),
2645 ADD_KNOWN_IID(EnumUnknown
),
2646 ADD_KNOWN_IID(EnumVARIANT
),
2647 ADD_KNOWN_IID(ExternalConnection
),
2648 ADD_KNOWN_IID(InternalMoniker
),
2649 ADD_KNOWN_IID(LockBytes
),
2650 ADD_KNOWN_IID(Malloc
),
2651 ADD_KNOWN_IID(Marshal
),
2652 ADD_KNOWN_IID(MessageFilter
),
2653 ADD_KNOWN_IID(Moniker
),
2654 ADD_KNOWN_IID(OleAdviseHolder
),
2655 ADD_KNOWN_IID(OleCache
),
2656 ADD_KNOWN_IID(OleCache2
),
2657 ADD_KNOWN_IID(OleCacheControl
),
2658 ADD_KNOWN_IID(OleClientSite
),
2659 ADD_KNOWN_IID(OleContainer
),
2660 ADD_KNOWN_IID(OleInPlaceActiveObject
),
2661 ADD_KNOWN_IID(OleInPlaceFrame
),
2662 ADD_KNOWN_IID(OleInPlaceObject
),
2663 ADD_KNOWN_IID(OleInPlaceSite
),
2664 ADD_KNOWN_IID(OleInPlaceUIWindow
),
2665 ADD_KNOWN_IID(OleItemContainer
),
2666 ADD_KNOWN_IID(OleLink
),
2667 ADD_KNOWN_IID(OleManager
),
2668 ADD_KNOWN_IID(OleObject
),
2669 ADD_KNOWN_IID(OlePresObj
),
2670 ADD_KNOWN_IID(OleWindow
),
2671 ADD_KNOWN_IID(PSFactory
),
2672 ADD_KNOWN_IID(ParseDisplayName
),
2673 ADD_KNOWN_IID(Persist
),
2674 ADD_KNOWN_IID(PersistFile
),
2675 ADD_KNOWN_IID(PersistStorage
),
2676 ADD_KNOWN_IID(PersistStream
),
2677 ADD_KNOWN_IID(ProxyManager
),
2678 ADD_KNOWN_IID(RootStorage
),
2679 ADD_KNOWN_IID(RpcChannel
),
2680 ADD_KNOWN_IID(RpcProxy
),
2681 ADD_KNOWN_IID(RpcStub
),
2682 ADD_KNOWN_IID(RunnableObject
),
2683 ADD_KNOWN_IID(RunningObjectTable
),
2684 ADD_KNOWN_IID(StdMarshalInfo
),
2685 ADD_KNOWN_IID(Storage
),
2686 ADD_KNOWN_IID(Stream
),
2687 ADD_KNOWN_IID(StubManager
),
2688 ADD_KNOWN_IID(Unknown
),
2689 ADD_KNOWN_IID(ViewObject
),
2690 ADD_KNOWN_IID(ViewObject2
),
2691 ADD_KNOWN_GUID(IID_IDispatch
),
2692 ADD_KNOWN_GUID(IID_IWebBrowser
),
2693 ADD_KNOWN_GUID(IID_IWebBrowserApp
),
2694 ADD_KNOWN_GUID(IID_IWebBrowser2
),
2695 ADD_KNOWN_GUID(IID_IWebBrowser
),
2696 ADD_KNOWN_GUID(DIID_DWebBrowserEvents2
),
2697 ADD_KNOWN_GUID(DIID_DWebBrowserEvents
),
2700 // don't clobber preprocessor name space
2701 #undef ADD_KNOWN_IID
2702 #undef ADD_KNOWN_GUID
2704 // try to find the interface in the table
2705 for ( size_t ui
= 0; ui
< WXSIZEOF(aKnownIids
); ui
++ )
2707 if ( riid
== *aKnownIids
[ui
].pIid
)
2709 return aKnownIids
[ui
].szName
;
2713 // unknown IID, just transform to string
2714 LPOLESTR str
= NULL
;
2715 StringFromIID(riid
, &str
);
2723 return _T("StringFromIID() error");