如何设置"基本URL"使用IWebBrowser2从内存加载的HTML文档?

时间:2017-04-19 19:05:31

标签: iwebbrowser2 ihtmldocument2

我正在使用IHTMLDocument2::write()描述here,以便将HTML从内存加载到IWebBrowser2实例中。代码如下所示:

#include <MsHTML.h>
void CMyDlg::WriteHTML(const wchar_t* html)
{
    IDispatch* pHtmlDoc = m_explorer.get_Document();
    if (!pHtmlDoc)
        return;
    CComPtr<IHTMLDocument2> doc2;
    doc2.Attach((IHTMLDocument2*)pHtmlDoc);
    if (!doc2)
        return;

    SAFEARRAY* psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
    if (!psaStrings)
        return;
    BSTR bstr = SysAllocString(html);
    if (bstr)
    {
        VARIANT* param;
        HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
        if (SUCCEEDED(hr))
        {
            param->vt = VT_BSTR;
            param->bstrVal = bstr;
            hr = SafeArrayUnaccessData(psaStrings);
            if (SUCCEEDED(hr))
            {
                doc2->write(psaStrings);
                doc2->close();
            }
        }
    }
    if (psaStrings)
        SafeArrayDestroy(psaStrings);
}

这正如我所期望的那样(加载了HTML)。但是,由于没有&#34;基本URL&#34;从中加载它们。

如何设置文档的基本URL,以便在&#34; http://bar.com/baz/foo.png&#34;中有图像foo.png时,可以通过&#href找到图像34;巴兹/ foo.png&#34;在加载的文档中?

1 个答案:

答案 0 :(得分:1)

如果您从根网站运行网站,它应该作为默认设置&#34; /&#34;。

(我假设您知道在标记中设置基本href的位置,例如<base href="/" />

但是,如果还有其他事情发生,你可以开始将基础href设置为绝对根,例如&#34; http://bar.com/&#34;

请注意,当我不得不修补它时,在基础href中使用相对根是不可靠的;它可能是,但我想为什么要这么麻烦。

当我从根目录下载一个网站时,我曾经必须这样做(我只是将这些位复制到正在运行的网络服务器的子目录中,并且在我刚刚执行此操作之前出现问题) 。我实际上是从根本上再跑了一次,这是迫使我这样做的,而你并没有这样做,这在我看来很奇怪,它不起作用,但同样,它是&#39有点值得尝试。

后来,我这样做了(在开始运行自己的root应用程序之前,允许我只使用&#34; /&#34;)。这允许我将它从测试移动到具有相同子目录根结构的prod:

<script type="text/javascript">
document.write("<base href='http://" + document.location.host + "/' />");
</script>
当我不得不这样做时,两个都对我有用。