2017-04-19 24 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

這對我不起作用。我認爲,因爲我的代碼在本地運行,並且鏈接位於遠程服務器上,所以基礎需要成爲遠程服務器。 –

相關問題