From: Connor McAdams cmcadams@codeweavers.com
Signed-off-by: Connor McAdams cmcadams@codeweavers.com --- dlls/uiautomationcore/tests/uiautomation.c | 5 ++--- dlls/uiautomationcore/uia_provider.c | 25 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/dlls/uiautomationcore/tests/uiautomation.c b/dlls/uiautomationcore/tests/uiautomation.c index da9bb6aa5c9..009864d10c7 100644 --- a/dlls/uiautomationcore/tests/uiautomation.c +++ b/dlls/uiautomationcore/tests/uiautomation.c @@ -12357,9 +12357,8 @@ static void test_node_hwnd_provider_(HUIANODE node, HWND hwnd, const char *file, winetest_push_context("UIA_ProcessIdPropertyId"); hr = UiaGetPropertyValue(node, UIA_ProcessIdPropertyId, &v); ok_(file, line)(hr == S_OK, "Unexpected hr %#lx\n", hr); - todo_wine ok_(file, line)(V_VT(&v) == VT_I4, "Unexpected VT %d\n", V_VT(&v)); - if (V_VT(&v) == VT_I4) - ok_(file, line)(V_I4(&v) == pid, "V_I4(&v) = %#lx, expected %#lx\n", V_I4(&v), pid); + ok_(file, line)(V_VT(&v) == VT_I4, "Unexpected VT %d\n", V_VT(&v)); + ok_(file, line)(V_I4(&v) == pid, "V_I4(&v) = %#lx, expected %#lx\n", V_I4(&v), pid); VariantClear(&v); winetest_pop_context(); } diff --git a/dlls/uiautomationcore/uia_provider.c b/dlls/uiautomationcore/uia_provider.c index 4d081b2c921..1f5cce7ffed 100644 --- a/dlls/uiautomationcore/uia_provider.c +++ b/dlls/uiautomationcore/uia_provider.c @@ -1202,6 +1202,16 @@ HRESULT WINAPI UiaProviderFromIAccessible(IAccessible *acc, long child_id, DWORD return S_OK; }
+static HRESULT uia_get_hr_for_last_error(void) +{ + DWORD last_err = GetLastError(); + + if (last_err == ERROR_INVALID_WINDOW_HANDLE) + return UIA_E_ELEMENTNOTAVAILABLE; + + return HRESULT_FROM_WIN32(last_err); +} + /* * Default ProviderType_BaseHwnd IRawElementProviderSimple interface. */ @@ -1292,6 +1302,21 @@ static HRESULT WINAPI base_hwnd_provider_GetPropertyValue(IRawElementProviderSim V_I4(ret_val) = HandleToUlong(base_hwnd_prov->hwnd); break;
+ case UIA_ProcessIdPropertyId: + { + DWORD pid; + + SetLastError(NOERROR); + if (!GetWindowThreadProcessId(base_hwnd_prov->hwnd, &pid)) + hr = uia_get_hr_for_last_error(); + else + { + V_VT(ret_val) = VT_I4; + V_I4(ret_val) = pid; + } + break; + } + default: break; }