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

How to set the "base URL" for a HTML document loaded from memory using IWebBrowser2?

我正在按照 here 所述使用 IHTMLDocument2::write(),以便将 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)。但是可以找到 none 的链接资源(图像等),因为没有可从中加载它们的“基础 URL”。

我如何设置文档的基础 URL,以便如果在“http://bar.com/baz/foo.png 中有图像 foo.png,图像可以通过加载文档中的“baz/foo.png”的 href 找到吗?

如果您 运行 您的网站不在根目录下,它应该作为默认的“/”工作。

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

但是,如果发生其他事情,您可以开始将基本 href 设置为绝对根目录,例如“http://bar.com/

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

以前,当我从根目录加载网站时,我必须这样做(我只是将这些位复制到 运行 网络服务器的子目录中,并且图像出现问题,直到我只是做了这个)。我实际上 运行 它从根部向下一个,这就是迫使我这样做的原因,而你没有那样做,这在我看来很奇怪,它不起作用,但同样,它是尝试。

后来我是这样操作的(之前启动运行自己root的app,让我直接用"/")。这允许我将它从测试移动到具有相同子目录根结构的产品:

<script type="text/javascript">
document.write("<base href='http://" + document.location.host + "/' />");
</script>

当我不得不这样做时,两者都对我有用。