#include "wx/msw/private.h" // for wxCopyRectToRECT
// autointerfaces that we only use here
-WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceSite, IOleInPlaceSite)
-WX_DECLARE_AUTOOLE(wxAutoIOleDocument, IOleDocument)
-WX_DECLARE_AUTOOLE(wxAutoIPersistStreamInit, IPersistStreamInit)
-WX_DECLARE_AUTOOLE(wxAutoIAdviseSink, IAdviseSink)
-WX_DECLARE_AUTOOLE(wxAutoIProvideClassInfo, IProvideClassInfo)
-WX_DECLARE_AUTOOLE(wxAutoITypeInfo, ITypeInfo)
-WX_DECLARE_AUTOOLE(wxAutoIConnectionPoint, IConnectionPoint)
-WX_DECLARE_AUTOOLE(wxAutoIConnectionPointContainer, IConnectionPointContainer)
+typedef wxAutoOleInterface<IOleInPlaceSite> wxAutoIOleInPlaceSite;
+typedef wxAutoOleInterface<IOleDocument> wxAutoIOleDocument;
+typedef wxAutoOleInterface<IPersistStreamInit> wxAutoIPersistStreamInit;
+typedef wxAutoOleInterface<IAdviseSink> wxAutoIAdviseSink;
+typedef wxAutoOleInterface<IProvideClassInfo> wxAutoIProvideClassInfo;
+typedef wxAutoOleInterface<ITypeInfo> wxAutoITypeInfo;
+typedef wxAutoOleInterface<IConnectionPoint> wxAutoIConnectionPoint;
+typedef wxAutoOleInterface<IConnectionPointContainer> wxAutoIConnectionPointContainer;
-wxDEFINE_EVENT( wxEVT_ACTIVEX, wxActiveXEvent )
+wxDEFINE_EVENT( wxEVT_ACTIVEX, wxActiveXEvent );
// Ole class helpers (sort of MFC-like) from wxActiveX
#define DECLARE_OLE_UNKNOWN(cls)\
{\
public:\
LONG l;\
- TAutoInitInt() : l(0) {}\
+ TAutoInitInt() : l(1) {}\
};\
TAutoInitInt refCount, lockCount;\
static void _GetInterface(cls *self, REFIID iid, void **_interface, const char *&desc);\
// wxVariants containing a void* to this variables are 'empty' in the sense
// that the actual ActiveX OLE parameter has not been converted and inserted
// into m_params.
- static const int ptr_invalid_entry_marker = 0;
- static wxVariant g_invalid_entry_marker;
+ static wxVariant ms_invalidEntryMarker;
wxActiveXEvents(wxActiveXContainer *ax) : m_activeX(ax), m_haveCustomId(false) {}
wxActiveXEvents(wxActiveXContainer *ax, REFIID iid) : m_activeX(ax), m_customId(iid), m_haveCustomId(true) {}
if (params_index < event.m_params.GetCount()) {
wxVariant &vx = event.m_params[params_index];
// copy the result back to pDispParams only if the event has been accessed
- // i.e. if vx != g_invalid_entry_marker
- if (!vx.IsType(wxActiveXEvents::g_invalid_entry_marker.GetType()) || vx!=g_invalid_entry_marker) {
+ // i.e. if vx != ms_invalidEntryMarker
+ if (!vx.IsType(wxActiveXEvents::ms_invalidEntryMarker.GetType()) || vx!=ms_invalidEntryMarker) {
VARIANTARG& va = pDispParams->rgvarg[i];
wxConvertVariantToOle(vx, va);
}
}
};
-wxVariant wxActiveXEvents::g_invalid_entry_marker((void*)&wxActiveXEvents::ptr_invalid_entry_marker);
+namespace
+{
+// just a unique global variable
+const int invalid_entry_marker = 0;
+}
+
+wxVariant wxActiveXEvents::ms_invalidEntryMarker((void*)&invalid_entry_marker);
size_t wxActiveXEvent::ParamCount() const
{
// 'native' will always be != if the event has been created
// for an actual active X event.
// But it may be zero if the event has been created by wx program code.
- if (native) {
- while (m_params.GetCount()<=idx) {
- m_params.Append(wxActiveXEvents::g_invalid_entry_marker);
+ if (native)
+ {
+ while ( m_params.GetCount()<=idx )
+ {
+ m_params.Append(wxActiveXEvents::ms_invalidEntryMarker);
}
- wxVariant &vx(m_params[idx]);
- if (vx.IsType(wxActiveXEvents::g_invalid_entry_marker.GetType()) && vx==wxActiveXEvents::g_invalid_entry_marker) {
+
+ wxVariant& vx = m_params[idx];
+ if ( vx.IsType(wxActiveXEvents::ms_invalidEntryMarker.GetType()) &&
+ vx == wxActiveXEvents::ms_invalidEntryMarker)
+ {
// copy the _real_ parameter into this one
// NOTE: m_params stores the parameters in *reverse* order.
// Whyever, but this was the case in the original implementation of
{
if (self->m_haveCustomId && IsEqualIID(iid, self->m_customId))
{
-// WXOLE_TRACE("Found Custom Dispatch Interface");
*_interface = (IUnknown *) (IDispatch *) self;
desc = "Custom Dispatch Interface";
return true;
}
// VZ: we might want to really report an error instead of just asserting here
-#ifdef __WXDEBUG__
+#if wxDEBUG_LEVEL
#define CHECK_HR(hr) \
- wxASSERT_MSG( SUCCEEDED(hr), \
- wxString::Format("HRESULT = %X", (unsigned)(hr)) )
+ wxASSERT_LEVEL_2_MSG( SUCCEEDED(hr), \
+ wxString::Format("HRESULT = %X", (unsigned)(hr)) )
#else
#define CHECK_HR(hr) wxUnusedVar(hr)
#endif
HRESULT hret =
cpContainer->FindConnectionPoint(ta->guid, cp.GetRef());
- CHECK_HR(hret);
- IDispatch* disp;
- m_frameSite->QueryInterface(IID_IDispatch, (void**)&disp);
- hret = cp->Advise(new wxActiveXEvents(this, ta->guid),
- &adviseCookie);
- CHECK_HR(hret);
+ // Notice that the return value of CONNECT_E_NOCONNECTION is
+ // expected if the interface doesn't support connection points.
+ if ( hret != CONNECT_E_NOCONNECTION )
+ {
+ CHECK_HR(hret);
+ }
+
+ if ( cp )
+ {
+ wxActiveXEvents * const
+ events = new wxActiveXEvents(this, ta->guid);
+ hret = cp->Advise(events, &adviseCookie);
+
+ // We don't need this object any more and cp will keep a
+ // reference to it if it needs it, i.e. if Advise()
+ // succeeded.
+ events->Release();
+
+ CHECK_HR(hret);
+ }
}
}