2017-04-19 48 views
0

我使用IHTMLDocument2::write(),如here所述,以便将HTML从内存加载到IWebBrowser2实例中。代码如下所示:如何为使用IWebBrowser2从内存加载的HTML文档设置“基本URL”?

#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被加载)。然而,没有任何链接的资源(图片等)可以找到,因为没有“base URL”来加载它们。

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

回答

1

如果你正在运行你的网站的根,它应该作为默认的“/”。

(我假设你知道在哪里可以在标记设置基本href,如<base href="/" />

但是,如果别的东西是怎么回事,你就可以开始了将基本href设置为绝对根,例如“http://bar.com/

请注意,使用基础href中的相对根并不可靠,因为我必须对此进行修改;它可能是,但我想明白为什么要麻烦。

当我从根目录加载它的时候,我曾经必须这样做(我只是将这些位拷贝到正在运行的web服务器的一个子目录中,并且直到我刚刚完成这些操作时才对映像有问题)。实际上,我从根源上再次下了一次,这就是迫使我做这件事的原因,而且你没有这样做,我觉得这很奇怪,它不起作用,但是再次尝试一下。后来,我这样做了(在开始运行它自己的根的应用程序之前,允许我只使用“/”)。这让我从测试移动它具有相同的子目录根部结构催促:

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

两个工作对我来说,当我不得不这样做。

+0

谢谢。我不知道标记,并插入解决了我的问题。 –

+0

如果您正在从根目录运行网站,则可能需要尝试“/”而不是绝对路径。它应该可以工作,并且是推荐的方式。 –

+0

这对我不起作用。我认为,因为我的代码在本地运行,并且链接位于远程服务器上,所以基础需要成为远程服务器。 –

相关问题