HRESULT WINAPI WindowFromAccessibleObject(IAccessible *acc, HWND *phwnd) { IDispatch *parent; IOleWindow *ow; HRESULT hres; TRACE("%p %p\n", acc, phwnd); IAccessible_AddRef(acc); while(1) { hres = IAccessible_QueryInterface(acc, &IID_IOleWindow, (void**)&ow); if(SUCCEEDED(hres)) { hres = IOleWindow_GetWindow(ow, phwnd); IOleWindow_Release(ow); IAccessible_Release(acc); return hres; } hres = IAccessible_get_accParent(acc, &parent); IAccessible_Release(acc); if(FAILED(hres)) return hres; if(hres!=S_OK || !parent) { *phwnd = NULL; return hres; } hres = IDispatch_QueryInterface(parent, &IID_IAccessible, (void**)&acc); IDispatch_Release(parent); if(FAILED(hres)) return hres; } }
static HRESULT WINAPI Client_QueryInterface(IAccessible *iface, REFIID riid, void **ppv) { Client *This = impl_from_Client(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); if(IsEqualIID(riid, &IID_IAccessible) || IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown)) { *ppv = iface; IAccessible_AddRef(iface); return S_OK; } return E_NOINTERFACE; }
static HRESULT WINAPI Client_QueryInterface(IAccessible *iface, REFIID riid, void **ppv) { Client *This = impl_from_Client(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); if(IsEqualIID(riid, &IID_IAccessible) || IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown)) { *ppv = iface; }else if(IsEqualIID(riid, &IID_IOleWindow)) { *ppv = &This->IOleWindow_iface; }else if(IsEqualIID(riid, &IID_IEnumVARIANT)) { *ppv = &This->IEnumVARIANT_iface; }else { WARN("no interface: %s\n", debugstr_guid(riid)); *ppv = NULL; return E_NOINTERFACE; } IAccessible_AddRef(iface); return S_OK; }
static ULONG WINAPI Client_EnumVARIANT_AddRef(IEnumVARIANT *iface) { Client *This = impl_from_Client_EnumVARIANT(iface); return IAccessible_AddRef(&This->IAccessible_iface); }
static ULONG WINAPI Client_OleWindow_AddRef(IOleWindow *iface) { Client *This = impl_from_Client_OleWindow(iface); return IAccessible_AddRef(&This->IAccessible_iface); }