From d0e8e6e3cd51736583603e37f0ba2ff7bdf29f5c Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Fri, 29 Nov 2013 19:17:33 +0100 Subject: winaccessibility: fix my stupid mistake in createAggInstance Change-Id: I7701021befcf1dbad85557c2095fe4bf0b4e0ff1 --- winaccessibility/source/UAccCOM/MAccessible.cxx | 33 +++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'winaccessibility') diff --git a/winaccessibility/source/UAccCOM/MAccessible.cxx b/winaccessibility/source/UAccCOM/MAccessible.cxx index 6e5f01807334..73897c4a469c 100644 --- a/winaccessibility/source/UAccCOM/MAccessible.cxx +++ b/winaccessibility/source/UAccCOM/MAccessible.cxx @@ -2560,14 +2560,15 @@ BOOL CMAccessible::GetXInterfaceFromXAccessible(XAccessible* pXAcc, XInterface** } template HRESULT -createAggInstance(CMAccessible &rOuter, REFIID iid, void ** ppvObject) +createAggInstance(CMAccessible &rOuter, void ** ppvObject) { -// return CComCreator< CComAggObject >::CreateInstance( -// XXX: do not use CComAggObject - the aggregation is hand-crafted! -// the SmartQI method must not call itself recursively - -// which it will do if CComAggObject redirects QueryInterface. - return CComCreator< CComObject >::CreateInstance( - rOuter.GetControllingUnknown(), iid, ppvObject); + // Note: CComAggObject has special handling for IUnknown - must + // query for that when creating it! Otherwise we get a T member of it + // which will redirect QueryInterface back to CMAccessible infinitely. + // (CComAggObject has its own ref-count too which is not a problem + // since it is inserted in m_containedObjects.) + return CComCreator< CComAggObject >::CreateInstance( + rOuter.GetControllingUnknown(), IID_IUnknown, ppvObject); } HRESULT WINAPI CMAccessible::SmartQI(void* /*pv*/, REFIID iid, void** ppvObject) @@ -2606,31 +2607,31 @@ HRESULT WINAPI CMAccessible::SmartQI(void* /*pv*/, REFIID iid, void** ppvObject) switch (pMap->XIFIndex) { case XI_COMPONENT: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_TEXT: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_EDITABLETEXT: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_IMAGE: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_TABLE: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_ACTION: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_VALUE: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_HYPERTEXT: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; case XI_HYPERLINK: - hr = createAggInstance(*this, iid, ppvObject); + hr = createAggInstance(*this, ppvObject); break; default: assert(false); -- cgit