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 HlinkFrame_Navigate(IHlinkFrame *iface, DWORD grfHLNF, LPBC pbc, IBindStatusCallback *pibsc, IHlink *pihlNavigate) { HlinkFrame *This = impl_from_IHlinkFrame(iface); IMoniker *mon; LPWSTR location = NULL; TRACE("(%p)->(%08x %p %p %p)\n", This, grfHLNF, pbc, pibsc, pihlNavigate); if(grfHLNF) FIXME("unsupported grfHLNF=%08x\n", grfHLNF); /* Windows calls GetTargetFrameName here. */ IHlink_GetMonikerReference(pihlNavigate, 1, &mon, &location); if(location) { FIXME("location = %s\n", debugstr_w(location)); CoTaskMemFree(location); } /* Windows calls GetHlinkSite here */ if(grfHLNF & HLNF_OPENINNEWWINDOW) { FIXME("Not supported HLNF_OPENINNEWWINDOW\n"); return E_NOTIMPL; } return navigate_hlink(This->doc_host, mon, pbc, pibsc); }
/*********************************************************************** * HlinkClone (HLINK.@) */ HRESULT WINAPI HlinkClone(IHlink *hlink, REFIID riid, IHlinkSite *hls, DWORD site_data, void **obj) { IMoniker *mk, *clone_mk = NULL; WCHAR *loc, *name = NULL; HRESULT hres; if(!hlink || !riid || !obj) return E_INVALIDARG; *obj = NULL; hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &mk, &loc); if(FAILED(hres)) return hres; if(mk) { IStream *strm; LARGE_INTEGER lgint; hres = CreateStreamOnHGlobal(NULL, TRUE, &strm); if(FAILED(hres)) { IMoniker_Release(mk); goto cleanup; } hres = OleSaveToStream((IPersistStream*)mk, strm); if(FAILED(hres)) { IStream_Release(strm); IMoniker_Release(mk); goto cleanup; } IMoniker_Release(mk); lgint.QuadPart = 0; hres = IStream_Seek(strm, lgint, STREAM_SEEK_SET, NULL); if(FAILED(hres)) { IStream_Release(strm); goto cleanup; } hres = OleLoadFromStream(strm, &IID_IMoniker, (void**)&clone_mk); IStream_Release(strm); if(FAILED(hres)) goto cleanup; } hres = IHlink_GetFriendlyName(hlink, HLFNAMEF_DEFAULT, &name); if(FAILED(hres)) goto cleanup; hres = HlinkCreateFromMoniker(clone_mk, loc, name, hls, site_data, NULL, &IID_IHlink, obj); cleanup: if(clone_mk) IMoniker_Release(clone_mk); CoTaskMemFree(loc); CoTaskMemFree(name); return hres; }