diff options
author | Andy Shaw <andy.shaw@qt.io> | 2017-10-18 10:26:28 +0200 |
---|---|---|
committer | Andy Shaw <andy.shaw@qt.io> | 2017-10-27 08:37:57 +0000 |
commit | 57e3935db685879f72fbd388b9d8d850f6424e79 (patch) | |
tree | 5efdfd74620cbad73be03a42d899974401eb0d0f | |
parent | ac92eba3f600a81f9b44e3a1e29f65ead2086b91 (diff) |
Get the right interface type for m_spInPlaceSite5.6
We depend on m_spInPlaceSite being an IOleInPlaceSiteWindowless
type as we call a function only available for that type and not the base
one. Therefore, we need to have a pointer to both interfaces, so we can
use the right one when needing IOleInPlaceSiteWindowless. Since not
all controls provide IOleInPlaceSiteWindowless we need to have both
in case IOleInPlaceSite is available.
Task-number: QTBUG-63903
Change-Id: Ieaf039c169347606aec43f53c8cb29e1317db3b9
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
(cherry picked from commit cacf666f95df9790cebf5d5cdb0609cee257fab3)
-rw-r--r-- | src/activeqt/control/qaxserverbase.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp index 5aa5a71..776fcc8 100644 --- a/src/activeqt/control/qaxserverbase.cpp +++ b/src/activeqt/control/qaxserverbase.cpp @@ -413,7 +413,8 @@ private: IAdviseSink *m_spAdviseSink; QList<STATDATA> adviseSinks; IOleClientSite *m_spClientSite; - IOleInPlaceSiteWindowless *m_spInPlaceSite; + IOleInPlaceSite *m_spInPlaceSite; + IOleInPlaceSiteWindowless *m_spInPlaceSiteWindowless; IOleInPlaceFrame *m_spInPlaceFrame; ITypeInfo *m_spTypeInfo; IStorage *m_spStorage; @@ -1089,6 +1090,7 @@ void QAxServerBase::init() m_spAdviseSink = 0; m_spClientSite = 0; + m_spInPlaceSiteWindowless = 0; m_spInPlaceSite = 0; m_spInPlaceFrame = 0; m_spTypeInfo = 0; @@ -1145,6 +1147,9 @@ QAxServerBase::~QAxServerBase() m_spClientSite = 0; if (m_spInPlaceFrame) m_spInPlaceFrame->Release(); m_spInPlaceFrame = 0; + if (m_spInPlaceSiteWindowless) + m_spInPlaceSiteWindowless->Release(); + m_spInPlaceSiteWindowless = 0; if (m_spInPlaceSite) m_spInPlaceSite->Release(); m_spInPlaceSite = 0; if (m_spTypeInfo) m_spTypeInfo->Release(); @@ -1798,8 +1803,8 @@ void QAxServerBase::update() if (isInPlaceActive) { if (m_hWnd) ::InvalidateRect(m_hWnd, 0, true); - else if (m_spInPlaceSite) - m_spInPlaceSite->InvalidateRect(NULL, true); + else if (m_spInPlaceSiteWindowless) + m_spInPlaceSiteWindowless->InvalidateRect(NULL, true); } else if (m_spAdviseSink) { m_spAdviseSink->OnViewChange(DVASPECT_CONTENT, -1); for (int i = 0; i < adviseSinks.count(); ++i) { @@ -3735,6 +3740,9 @@ HRESULT WINAPI QAxServerBase::Close(DWORD dwSaveOption) m_spClientSite->OnShowWindow(false); } + if (m_spInPlaceSiteWindowless) + m_spInPlaceSiteWindowless->Release(); + m_spInPlaceSiteWindowless = 0; if (m_spInPlaceSite) m_spInPlaceSite->Release(); m_spInPlaceSite = 0; @@ -3995,6 +4003,9 @@ HRESULT WINAPI QAxServerBase::SetClientSite(IOleClientSite* pClientSite) { // release all client site interfaces if (m_spClientSite) m_spClientSite->Release(); + if (m_spInPlaceSiteWindowless) + m_spInPlaceSiteWindowless->Release(); + m_spInPlaceSiteWindowless = 0; if (m_spInPlaceSite) m_spInPlaceSite->Release(); m_spInPlaceSite = 0; if (m_spInPlaceFrame) m_spInPlaceFrame->Release(); @@ -4004,6 +4015,8 @@ HRESULT WINAPI QAxServerBase::SetClientSite(IOleClientSite* pClientSite) if (m_spClientSite) { m_spClientSite->AddRef(); m_spClientSite->QueryInterface(IID_IOleInPlaceSite, reinterpret_cast<void **>(&m_spInPlaceSite)); + m_spClientSite->QueryInterface(IID_IOleInPlaceSiteWindowless, + reinterpret_cast<void **>(&m_spInPlaceSiteWindowless)); } return S_OK; |