/*********************************************************************** * HlinkCreateFromMoniker (HLINK.@) */ HRESULT WINAPI HlinkCreateFromMoniker( IMoniker *pimkTrgt, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, IHlinkSite* pihlsite, DWORD dwSiteData, IUnknown* piunkOuter, REFIID riid, void** ppvObj) { IHlink *hl = NULL; HRESULT r; TRACE("%p %s %s %p %i %p %s %p\n", pimkTrgt, debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName), pihlsite, dwSiteData, piunkOuter, debugstr_guid(riid), ppvObj); r = CoCreateInstance(&CLSID_StdHlink, piunkOuter, CLSCTX_INPROC_SERVER, riid, (LPVOID*)&hl); if (FAILED(r)) return r; IHlink_SetMonikerReference(hl, HLINKSETF_LOCATION | HLINKSETF_TARGET, pimkTrgt, pwzLocation); if (pwzFriendlyName) IHlink_SetFriendlyName(hl, pwzFriendlyName); if (pihlsite) IHlink_SetHlinkSite(hl, pihlsite, dwSiteData); *ppvObj = hl; TRACE("Returning %i\n",r); return r; }
static HRESULT WINAPI IHlink_fnSetStringReference(IHlink* iface, DWORD grfHLSETF, LPCWSTR pwzTarget, LPCWSTR pwzLocation) { HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%i %s %s)\n", This, grfHLSETF, debugstr_w(pwzTarget), debugstr_w(pwzLocation)); if(grfHLSETF > (HLINKSETF_TARGET | HLINKSETF_LOCATION) && grfHLSETF < -(HLINKSETF_TARGET | HLINKSETF_LOCATION)) return grfHLSETF; if (grfHLSETF & HLINKSETF_TARGET) { if (This->Moniker) { IMoniker_Release(This->Moniker); This->Moniker = NULL; } if (pwzTarget && *pwzTarget) { IMoniker *pMon; IBindCtx *pbc = NULL; ULONG eaten; HRESULT r; r = CreateBindCtx(0, &pbc); if (FAILED(r)) return E_OUTOFMEMORY; r = MkParseDisplayName(pbc, pwzTarget, &eaten, &pMon); IBindCtx_Release(pbc); if (FAILED(r)) { LPCWSTR p = strchrW(pwzTarget, ':'); if (p && (p - pwzTarget > 1)) r = CreateURLMoniker(NULL, pwzTarget, &pMon); else r = CreateFileMoniker(pwzTarget, &pMon); if (FAILED(r)) { ERR("couldn't create moniker for %s, failed with error 0x%08x\n", debugstr_w(pwzTarget), r); return r; } } IHlink_SetMonikerReference(iface, HLINKSETF_TARGET, pMon, NULL); IMoniker_Release(pMon); } } if (grfHLSETF & HLINKSETF_LOCATION) { heap_free(This->Location); This->Location = NULL; if (pwzLocation && *pwzLocation) This->Location = hlink_strdupW( pwzLocation ); } return S_OK; }