static COMPtr<IAccessible> findAccessibleObjectById(AccessibilityUIElement parentObject, BSTR idAttribute) { COMPtr<IAccessible> parentIAccessible = parentObject.platformUIElement(); COMPtr<IServiceProvider> serviceProvider(Query, parentIAccessible); if (!serviceProvider) return 0; COMPtr<IAccessibleComparable> comparable = comparableObject(serviceProvider); if (!comparable) return 0; _variant_t value; _bstr_t elementIdAttributeKey(L"AXDRTElementIdAttribute"); if (SUCCEEDED(comparable->get_attribute(elementIdAttributeKey, &value.GetVARIANT()))) { ASSERT(V_VT(&value) == VT_BSTR); if (VARCMP_EQ == ::VarBstrCmp(value.bstrVal, idAttribute, LOCALE_USER_DEFAULT, 0)) return parentIAccessible; } long childCount = parentObject.childrenCount(); if (!childCount) return nullptr; COMPtr<IAccessible> result; for (long i = 0; i < childCount; ++i) { AccessibilityUIElement childAtIndex = parentObject.getChildAtIndex(i); result = findAccessibleObjectById(childAtIndex, idAttribute); if (result) return result; } return nullptr; }