【问题标题】:How to set the "base URL" for a HTML document loaded from memory using IWebBrowser2?如何为使用 IWebBrowser2 从内存加载的 HTML 文档设置“基本 URL”?
【发布时间】:2017-04-19 19:05:31
【问题描述】:

我使用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 已加载)。但是,找不到任何链接的资源(图像等),因为没有可以从中加载它们的“基本 URL”。

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

【问题讨论】:

    标签: iwebbrowser2 ihtmldocument2


    【解决方案1】:

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

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

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

    请注意,当我不得不修改它时,在基本 href 中使用相对根是不可靠的;它可能是,但我想为什么要打扰。

    当我从根目录加载站点时,我曾经必须为站点执行此操作(我只是将这些位复制到正在运行的网络服务器的子目录中,并且在我这样做之前遇到了图像问题)。实际上,我从根部又将其运行了一次,这迫使我这样做,而您没有这样做,这在我看来很奇怪,它不起作用,但是再次尝试一下。

    后来,我就这样做了(在开始运行它自己的root的应用程序之前,允许我只使用“/”)。这使我可以使用相同的子目录根结构将其从 test 移动到 prod:

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

    当我不得不这样做时,两者都为我工作。

    【讨论】:

    • 谢谢。我不知道 标签,插入 bar.com" /> 解决了我的问题。
    • 如果您在根目录下运行您的站点,您可能只想尝试“/”而不是绝对路径。它应该可以工作,并且是推荐的方法。
    • 这对我不起作用。我认为因为我的代码在本地运行并且链接在远程服务器上,所以基础需要是远程的。
    • 啊,是的,这将是您必须更明确指出的情况之一。请记住,任何其他资源(例如 API 调用的路径)要么需要位于同一根目录,要么您必须进行其他调整。
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 2011-07-19
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多