X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a1f48575d11df10dba9353588003f71d8b126e90..be8b43858c480325553a66a43c9fcd92d036b885:/src/msw/ole/activex.cpp diff --git a/src/msw/ole/activex.cpp b/src/msw/ole/activex.cpp index 2c53f29629..c5ea0cb8e9 100644 --- a/src/msw/ole/activex.cpp +++ b/src/msw/ole/activex.cpp @@ -30,7 +30,11 @@ #include "wx/math.h" #endif +#include "wx/msw/dc.h" + #include "wx/msw/ole/activex.h" +#include "wx/msw/private.h" // for wxCopyRectToRECT + // autointerfaces that we only use here WX_DECLARE_AUTOOLE(wxAutoIOleInPlaceSite, IOleInPlaceSite) WX_DECLARE_AUTOOLE(wxAutoIOleDocument, IOleDocument) @@ -41,7 +45,7 @@ WX_DECLARE_AUTOOLE(wxAutoITypeInfo, ITypeInfo) WX_DECLARE_AUTOOLE(wxAutoIConnectionPoint, IConnectionPoint) WX_DECLARE_AUTOOLE(wxAutoIConnectionPointContainer, IConnectionPointContainer) -DEFINE_EVENT_TYPE(wxEVT_ACTIVEX) +wxDEFINE_EVENT( wxEVT_ACTIVEX, wxActiveXEvent ) // Ole class helpers (sort of MFC-like) from wxActiveX #define DECLARE_OLE_UNKNOWN(cls)\ @@ -827,8 +831,24 @@ wxActiveXContainer::~wxActiveXContainer() m_oleObject->Close(OLECLOSE_NOSAVE); m_oleObject->SetClientSite(NULL); } + + // m_clientSite uses m_frameSite so destroy it first + m_clientSite.Free(); + delete m_frameSite; + + // our window doesn't belong to us, don't destroy it + m_hWnd = NULL; } +// VZ: we might want to really report an error instead of just asserting here +#ifdef __WXDEBUG__ + #define CHECK_HR(hr) \ + wxASSERT_MSG( SUCCEEDED(hr), \ + wxString::Format("HRESULT = %X", (unsigned)(hr)) ) +#else + #define CHECK_HR(hr) wxUnusedVar(hr) +#endif + //--------------------------------------------------------------------------- // wxActiveXContainer::CreateActiveX // @@ -841,20 +861,21 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) { HRESULT hret; hret = m_ActiveX.QueryInterface(iid, pUnk); - wxASSERT(SUCCEEDED(hret)); + CHECK_HR(hret); // FrameSite - FrameSite *frame = new FrameSite(m_realparent, this); + m_frameSite = new FrameSite(m_realparent, this); // oleClientSite hret = m_clientSite.QueryInterface( - IID_IOleClientSite, (IDispatch *) frame); - wxASSERT(SUCCEEDED(hret)); + IID_IOleClientSite, (IDispatch *) m_frameSite); + CHECK_HR(hret); // adviseSink - wxAutoIAdviseSink adviseSink(IID_IAdviseSink, (IDispatch *) frame); + wxAutoIAdviseSink adviseSink(IID_IAdviseSink, (IDispatch *) m_frameSite); wxASSERT(adviseSink.Ok()); // Get Dispatch interface hret = m_Dispatch.QueryInterface(IID_IDispatch, m_ActiveX); + CHECK_HR(hret); // // SETUP TYPEINFO AND ACTIVEX EVENTS @@ -867,12 +888,13 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) // type info wxAutoITypeInfo typeInfo; hret = classInfo->GetClassInfo(typeInfo.GetRef()); + CHECK_HR(hret); wxASSERT(typeInfo.Ok()); // TYPEATTR TYPEATTR *ta = NULL; hret = typeInfo->GetTypeAttr(&ta); - wxASSERT(ta); + CHECK_HR(hret); // this should be a TKIND_COCLASS wxASSERT(ta->typekind == TKIND_COCLASS); @@ -893,8 +915,9 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) if (! ti.Ok()) continue; + CHECK_HR(hret); + // check if default event sink - bool defInterface = false; bool defEventSink = false; int impTypeFlags = 0; typeInfo->GetImplTypeFlags(i, &impTypeFlags); @@ -912,11 +935,6 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) wxFAIL_MSG(wxT("Default event sink is in vtable!")); } } - else - { - // WXOLE_TRACEOUT("Default Interface"); - defInterface = true; - } } @@ -924,7 +942,7 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) // TYPEATTR TYPEATTR *ta = NULL; hret = ti->GetTypeAttr(&ta); - wxASSERT(ta); + CHECK_HR(hret); if (ta->typekind == TKIND_DISPATCH) { @@ -939,15 +957,13 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) HRESULT hret = cpContainer->FindConnectionPoint(ta->guid, cp.GetRef()); - wxASSERT ( SUCCEEDED(hret)); + CHECK_HR(hret); IDispatch* disp; - frame->QueryInterface(IID_IDispatch, (void**)&disp); + m_frameSite->QueryInterface(IID_IDispatch, (void**)&disp); hret = cp->Advise(new wxActiveXEvents(this, ta->guid), &adviseCookie); - wxASSERT_MSG( SUCCEEDED(hret), - wxString::Format(wxT("Cannot connect!\nHRESULT:%X"), (unsigned int)hret) - ); + CHECK_HR(hret); } } @@ -963,15 +979,17 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) // Get IOleObject interface hret = m_oleObject.QueryInterface(IID_IOleObject, m_ActiveX); - wxASSERT(SUCCEEDED(hret)); + CHECK_HR(hret); // get IViewObject Interface hret = m_viewObject.QueryInterface(IID_IViewObject, m_ActiveX); - wxASSERT(SUCCEEDED(hret)); + CHECK_HR(hret); // document advise m_docAdviseCookie = 0; hret = m_oleObject->Advise(adviseSink, &m_docAdviseCookie); + CHECK_HR(hret); + // TODO:Needed? // hret = m_viewObject->SetAdvise(DVASPECT_CONTENT, 0, adviseSink); m_oleObject->SetHostNames(L"wxActiveXContainer", NULL); @@ -982,12 +1000,12 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) // Get IOleInPlaceObject interface hret = m_oleInPlaceObject.QueryInterface( IID_IOleInPlaceObject, m_ActiveX); - wxASSERT(SUCCEEDED(hret)); + CHECK_HR(hret); // status DWORD dwMiscStatus; m_oleObject->GetMiscStatus(DVASPECT_CONTENT, &dwMiscStatus); - wxASSERT(SUCCEEDED(hret)); + CHECK_HR(hret); // set client site first ? if (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) @@ -1001,15 +1019,13 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) if (pPersistStreamInit.Ok()) { hret = pPersistStreamInit->InitNew(); + CHECK_HR(hret); } if (! (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)) m_oleObject->SetClientSite(m_clientSite); - RECT posRect; - ::GetClientRect((HWND)m_realparent->GetHWND(), &posRect); - m_oleObjectHWND = 0; if (m_oleInPlaceObject.Ok()) @@ -1022,19 +1038,28 @@ void wxActiveXContainer::CreateActiveX(REFIID iid, IUnknown* pUnk) if (! (dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME)) { + RECT posRect; + wxCopyRectToRECT(m_realparent->GetClientSize(), posRect); + if (posRect.right > 0 && posRect.bottom > 0 && m_oleInPlaceObject.Ok()) - m_oleInPlaceObject->SetObjectRects(&posRect, &posRect); + { + m_oleInPlaceObject->SetObjectRects(&posRect, &posRect); + } hret = m_oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, m_clientSite, 0, (HWND)m_realparent->GetHWND(), &posRect); + CHECK_HR(hret); + hret = m_oleObject->DoVerb(OLEIVERB_SHOW, 0, m_clientSite, 0, (HWND)m_realparent->GetHWND(), &posRect); + CHECK_HR(hret); } if (! m_oleObjectHWND && m_oleInPlaceObject.Ok()) { hret = m_oleInPlaceObject->GetWindow(&m_oleObjectHWND); + CHECK_HR(hret); } if (m_oleObjectHWND) @@ -1129,8 +1154,9 @@ void wxActiveXContainer::OnPaint(wxPaintEvent& WXUNUSED(event)) ::InvalidateRect(m_oleObjectHWND, NULL, false); #endif RECTL *prcBounds = (RECTL *) &posRect; + wxMSWDCImpl *msw = wxDynamicCast( dc.GetImpl() , wxMSWDCImpl ); m_viewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, NULL, - (HDC)dc.GetHDC(), prcBounds, NULL, NULL, 0); + (HDC)msw->GetHDC(), prcBounds, NULL, NULL, 0); } }