static void test_LresultFromObject(const char *name) { PROCESS_INFORMATION proc; STARTUPINFOA startup; char cmdline[MAX_PATH]; IUnknown *unk; HRESULT hres; LRESULT lres; lres = LresultFromObject(NULL, 0, 0); ok(lres == E_INVALIDARG, "got %lx\n", lres); hres = ObjectFromLresult(0, &IID_IUnknown, 0, (void**)&unk); ok(hres == E_FAIL, "got %x\n", hres); hres = ObjectFromLresult(0x10000, &IID_IUnknown, 0, (void**)&unk); ok(hres == E_FAIL, "got %x\n", hres); ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); lres = LresultFromObject(&IID_IUnknown, 0, &Object); ok(SUCCEEDED(lres), "got %lx\n", lres); ok(Object_ref > 1, "Object_ref = %d\n", Object_ref); hres = ObjectFromLresult(lres, &IID_IUnknown, 0, (void**)&unk); ok(hres == S_OK, "hres = %x\n", hres); ok(unk == &Object, "unk != &Object\n"); IUnknown_Release(unk); ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); lres = LresultFromObject(&IID_IUnknown, 0, &Object); ok(SUCCEEDED(lres), "got %lx\n", lres); ok(Object_ref > 1, "Object_ref = %d\n", Object_ref); sprintf(cmdline, "\"%s\" main ObjectFromLresult %lx", name, lres); memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &proc); winetest_wait_child_process(proc.hProcess); ok(Object_ref == 1, "Object_ref = %d\n", Object_ref); }
static IDispatch *get_ie_target(HWND hwnd, int x, int y) { IDispatch *top_doc, *elem, *target; UINT getobj_msg; LRESULT lres, res; HRESULT hres; getobj_msg = RegisterWindowMessageW(L"WM_HTML_GETOBJECT"); if(getobj_msg == 0) { spr->log_lasterror( LOG_LEVEL_NOTIFY, L"ie-scroll: Failed to call " L"RegisterWindowMessage(\"WM_HTML_GETOBJECT\")", 1); return NULL; } lres = SendMessageTimeout(hwnd, getobj_msg, 0, 0, SMTO_ABORTIFHUNG, 1000, (PDWORD_PTR)&res); if(lres == 0) { spr->log_lasterror( LOG_LEVEL_NOTIFY, L"ie-scroll: Failed to call SendMessageTimeout()", 1); return NULL; } hres = ObjectFromLresult(res, &IID_IDispatch, 0, (void **)(void *)&top_doc); if(FAILED(hres)) { spr->log_hresult( LOG_LEVEL_NOTIFY, L"ie-scroll: Failed to call ObjectFromLresult()", hres, 1); return NULL; } hres = get_ie_elem_at(top_doc, x, y, &elem); IDispatch_Release(top_doc); if(FAILED(hres)) { return NULL; } hres = get_scrollable_parent(elem, &target); IDispatch_Release(elem); if(FAILED(hres)) { return NULL; } return target; }
IAccessible* NativeViewHostWin::GetNativeViewAccessible() { HWND hwnd = host_->native_view(); if(!IsWindow(hwnd)) { return NULL; } LRESULT ret = SendMessage(hwnd, WM_GETOBJECT, 0, OBJID_CLIENT); IAccessible* accessible = NULL; HRESULT success = ObjectFromLresult(ret, IID_IDispatch, 0, reinterpret_cast<void**>(accessible)); if(success == S_OK) { return accessible; } else { return NULL; } }
HRESULT WINAPI AccessibleObjectFromWindow( HWND hwnd, DWORD dwObjectID, REFIID riid, void** ppvObject ) { TRACE("%p %d %s %p\n", hwnd, dwObjectID, debugstr_guid( riid ), ppvObject ); if(!ppvObject) return E_INVALIDARG; *ppvObject = NULL; if(IsWindow(hwnd)) { LRESULT lres; lres = SendMessageW(hwnd, WM_GETOBJECT, 0xffffffff, dwObjectID); if(FAILED(lres)) return lres; else if(lres) return ObjectFromLresult(lres, riid, 0, ppvObject); } return CreateStdAccessibleObject(hwnd, dwObjectID, riid, ppvObject); }