我正在尝试从内存加载html文件并显示它。但是我有以下问题。我可以轻松地从资源或本地目录显示html文件,并动态更改其内容。我的问题是,html文件有一些图像。为了正确显示图像,图像和html文件当然必须在同一目录中。如果我从资源加载html,html控件看起来资源目录(FindResource,LoadResource等)来查找图像。如果我在应用程序目录中设置本地文件并加载它,它可以工作,但它会在程序目录中创建一个虚拟文件。我已经提出了一些实现这一点的想法,我希望你能给我一些评论。
感谢。
答案 0 :(得分:1)
如果Stack Overflow上有一个一致的东西,那就是试图用正则表达式解析DOM会让你大喊大叫。
但是,我有一个想法,使用正则表达式在html中找到一个模式,你可以插入一个可能解决问题的元素。
你可以做什么(我在20年内没有完成C ++所以我将不得不使用伪代码),找到head标签并添加一个指定基本URL的base
元素适用于所有图像和锚点。
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解析器,但这应该可以解决。
答案 1 :(得分:0)
感谢@Daniel轻松解决问题。当我第一次创建文档时,我使用about:blank为空页面,然后将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();
}
}