summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@qt.io>2017-10-18 10:26:28 +0200
committerAndy Shaw <andy.shaw@qt.io>2017-10-27 08:37:57 +0000
commit57e3935db685879f72fbd388b9d8d850f6424e79 (patch)
tree5efdfd74620cbad73be03a42d899974401eb0d0f
parentac92eba3f600a81f9b44e3a1e29f65ead2086b91 (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.cpp19
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;