2014-10-30 78 views
0

我想從內存中加載HTML文件並顯示它。不過,我有以下問題。我可以輕鬆地從資源或本地目錄顯示html文件,並即時更改其內容。我的問題是,html文件有一些圖像。爲了正確顯示圖像,圖像和html文件必須在同一個目錄中。如果我從資源中加載html,html控件會查找資源目錄(FindResource,LoadResource等)來查找圖像。如果我在應用程序目錄中設置了一個本地文件並加載它,它會在程序目錄中創建一個虛擬文件。我已經提出了實施這個想法的幾個想法,我希望你能給我一些意見。從資源從內存中嵌入HTML在c + +磁盤上的圖像

  1. 負載啞的HTML文件,從MSHTML飛鉤,FindResource,LoadResource等添加HTML並給文件名,文件大小,內容
  2. 使用正則表達式過濾器找到src屬性並連接目錄名與文件://協議
  3. 使用html解析器遍歷DOM並更改src屬性。

謝謝。

回答

1

如果在Stack Overflow上有一個一致的事情,那就是試圖用正則表達式來解析DOM會讓你大吃一驚。

但是,我有一個想法,它使用正則表達式在html中查找模式,並且可以插入一個可能解決問題的元素。

你可以做什麼(並且20年來我還沒有完成C++,所以我將不得不僞造代碼),找到head標籤並添加一個base元素,該元素指定所有圖像的基本url和錨點。

Regex regex = new Regex('</head>', RegexFlag.CaseInsensitve); 
sHtml = regex.replace(sHtml, "<base href=\"http://www.base.com/" /></head>"); 

這假設你總是有一個頭標籤,而且你的頭元素結構良好。你可能需要檢查一下,正則表達式實際上首先找到了一些東西,如果它不是,那麼做一些與html元素的開始標籤類似的東西,如果你找不到那麼好......垃圾入,垃圾出。

屁,一個基本元素可能實際上已經存在。所以你可能想要做一個正則表達式替換:<base[^>]*>。只需用空字符串替換即可。

更多關於基本元素:http://webdesign.tutsplus.com/articles/quick-tip-set-relative-urls-with-the-base-tag--cms-21399

...顯然不太馬虎解決方案是使用DOM解析器,但這應該在緊要關頭。

+0

我知道正則表達式不是好主意我只是想知道什麼是好的。對於任何感興趣的人來說,我的快速正則表達式替換代碼 string str =「」+ src = \「)([^ \」>] +)「); std :: string replacement =「$ 1file:// newpath $ 2」; std :: string str2 = std :: tr1 :: regex_replace(str,rx,replacement); – Meanteacher 2014-10-30 13:43:47

+0

如果使用正則表達式更新圖像上的src,最終會漏掉一個案例,除非文檔對格式的一致性非常有信心。相反,我會嘗試一些測試文檔,看看base是否能解決您的問題,如果有問題,請嘗試我提出的解決方案。 – 2014-10-30 13:48:29

+0

很明顯,您希望在問題中將每個想法的基本URL設置爲一個'file://'URL。 ''是強制性的,所以部分應該是安全的。 – MSalters 2014-10-30 14:11:42

0

感謝@丹尼爾爲簡單的修復。當我第一次創建文檔時,我使用about:空白頁面,然後將baseurl設置爲我想要使用的目錄。我試圖使用file://但它不起作用。因此我使用完整路徑名稱。再次感謝@Daniel和@MSalters幫助我。對於這裏感興趣的人是代碼。

m_Browser.Navigate(_T("about:blank")); //navigate to blank document 
IDispatch* pDispatch = m_Browser.GetHtmlDocument(); 

//Only if a resource or web page is loaded can we get the document 
if(pDispatch != NULL) 
{ 
    IHTMLDocument2* pHtmlDoc; 
    HRESULT hr = pDispatch->QueryInterface(__uuidof(IHTMLDocument2), (void**)&pHtmlDoc); 
    pDispatch->Release(); 
    if(SUCCEEDED(hr)) 
    { 

// Create a safearray to store the HTML text 
CComBSTR bstrURL; 
CComVariant varDummy; 
SAFEARRAY  *pSA; 
SAFEARRAYBOUND saBound = {1, 0}; 
pSA = SafeArrayCreate(VT_VARIANT, 1, &saBound); 



// Copy the HTML into the one and only element 
VARIANT *pVar; 
CComBSTR bstrHTML = "<html><head><base href=\"C:\\\"></head><body>Hello!</body></html>";    // Load the text 
varDummy = bstrHTML;      // .. into a variant 

SafeArrayAccessData(pSA, (void**)&pVar); // Access safearray data 
pVar[0] = varDummy;       // Set the text data 
SafeArrayUnaccessData(pSA);     // Release access 

// Write the HTML as the document's new text 
pHtmlDoc->write(pSA);       // Overwrite HTML 
SafeArrayDestroy(pSA); 
pHtmlDoc->close(); 
    } 
} 
相關問題