Micorosoft純正のCOMオブジェクトでは、HogeURL等(*)のプロパティで
相対パスが使えますが、ISVが作成したCOMオブジェクトでは相対パスが
使えなかったりします。
* : ブラウザコントロールに貼り付けるのようなものの場合
これに対応するには、以下の関数を使えばOKです。
"URLを絶対パスにする"と言っても、単なる文字列の処理ではなく、
ブラウザコントロールで表示しているページの場所と相対パスを
結合して絶対パスに変換します。
---
static HRESULT UrlCombine(IUnknownPtr spUnkSite, LPCTSTR szRelative, CString& strCombined)
{
USES_CONVERSION;
HRESULT hr = S_OK;
try
{
strCombined.Empty();
IBindHostPtr spBindHost = ::QueryBindHost(spUnkSite);
if (spBindHost == NULL)
{
return E_FAIL;
}
IBindCtxPtr spBindCtx;
hr = ::CreateBindCtx(0, &spBindCtx);
if (FAILED(hr))
{
return hr;
}
IMonikerPtr spMoniker;
hr = spBindHost->CreateMoniker(T2W(szRelative), spBindCtx, &spMoniker, 0);
if (FAILED(hr))
{
return hr;
}
LPOLESTR wszDisplayName = NULL;
hr = spMoniker->GetDisplayName(spBindCtx, NULL, &wszDisplayName);
if (FAILED(hr))
{
return hr;
}
strCombined = W2T(wszDisplayName);
// 必ず、最後に行なうこと!!
::CoTaskMemFree(wszDisplayName);
}
catch (...)
{
return E_FAIL;
}
return S_OK;
}
---