static void test_reference(void) { HRESULT r; IHlink *lnk = NULL; IMoniker *mk = NULL; const WCHAR url[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g',0 }; const WCHAR url2[] = { 'h','t','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/',0 }; LPWSTR str = NULL; r = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); ok(r == S_OK, "failed to create link\n"); if (FAILED(r)) return; r = IHlink_GetMonikerReference(lnk, HLINKGETREF_DEFAULT, NULL, NULL); ok(r == S_OK, "failed\n"); r = IHlink_GetMonikerReference(lnk, HLINKGETREF_DEFAULT, &mk, &str); ok(r == S_OK, "failed\n"); ok(mk != NULL, "no moniker\n"); ok(str == NULL, "string should be null\n"); r = IMoniker_Release(mk); ok( r == 1, "moniker refcount wrong\n"); r = IHlink_GetStringReference(lnk, -1, &str, NULL); ok(r == S_OK, "failed\n"); CoTaskMemFree(str); r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, &str, NULL); ok(r == S_OK, "failed\n"); todo_wine { ok(!lstrcmpW(str, url2), "url wrong\n"); } CoTaskMemFree(str); r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, NULL, NULL); ok(r == S_OK, "failed\n"); r = IHlink_GetStringReference(lnk, HLINKGETREF_DEFAULT, NULL, &str); ok(r == S_OK, "failed\n"); ok(str == NULL, "string should be null\n"); /* Unimplented functions checks */ r = IHlink_GetAdditionalParams(lnk, NULL); ok(r == E_NOTIMPL, "failed\n"); r = IHlink_SetAdditionalParams(lnk, NULL); ok(r == E_NOTIMPL, "failed\n"); IHlink_Release(lnk); }
static HRESULT WINAPI IHlink_fnNavigate(IHlink* iface, DWORD grfHLNF, LPBC pbc, IBindStatusCallback *pbsc, IHlinkBrowseContext *phbc) { HlinkImpl *This = impl_from_IHlink(iface); IMoniker *mon = NULL; HRESULT r; FIXME("Semi-Stub:(%p)->(%i %p %p %p)\n", This, grfHLNF, pbc, pbsc, phbc); r = __GetMoniker(This, &mon, HLINKGETREF_ABSOLUTE); TRACE("Moniker %p\n", mon); if (SUCCEEDED(r)) { IBindCtx *bcxt; IUnknown *unk = NULL; IHlinkTarget *target; CreateBindCtx(0, &bcxt); RegisterBindStatusCallback(bcxt, pbsc, NULL, 0); r = IMoniker_BindToObject(mon, bcxt, NULL, &IID_IUnknown, (void**)&unk); if (r == S_OK) { r = IUnknown_QueryInterface(unk, &IID_IHlinkTarget, (void**)&target); IUnknown_Release(unk); } if (r == S_OK) { IHlinkTarget_SetBrowseContext(target, phbc); r = IHlinkTarget_Navigate(target, grfHLNF, This->Location); IHlinkTarget_Release(target); } else { static const WCHAR szOpen[] = {'o','p','e','n',0}; LPWSTR target = NULL; r = IHlink_GetStringReference(iface, HLINKGETREF_DEFAULT, &target, NULL); if (SUCCEEDED(r) && target) { ShellExecuteW(NULL, szOpen, target, NULL, NULL, SW_SHOW); CoTaskMemFree(target); } } RevokeBindStatusCallback(bcxt, pbsc); IBindCtx_Release(bcxt); IMoniker_Release(mon); } if (This->Site) IHlinkSite_OnNavigationComplete(This->Site, This->SiteData, 0, r, NULL); TRACE("Finished Navigation\n"); return r; }
static HRESULT WINAPI IHlink_fnGetMonikerReference(IHlink* iface, DWORD dwWhichRef, IMoniker **ppimkTarget, LPWSTR *ppwzLocation) { HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p) -> (%i %p %p)\n", This, dwWhichRef, ppimkTarget, ppwzLocation); if (ppimkTarget) { HRESULT hres = __GetMoniker(This, ppimkTarget, dwWhichRef); if (FAILED(hres)) { if (ppwzLocation) *ppwzLocation = NULL; return hres; } } if (ppwzLocation) IHlink_GetStringReference(iface, dwWhichRef, NULL, ppwzLocation); return S_OK; }