使用c ++在磁盘上嵌入带有图像的html

时间:2014-10-30 13:02:11

标签: html c++ regex

我正在尝试从内存加载html文件并显示它。但是我有以下问题。我可以轻松地从资源或本地目录显示html文件,并动态更改其内容。我的问题是,html文件有一些图像。为了正确显示图像,图像和html文件当然必须在同一目录中。如果我从资源加载html,html控件看起来资源目录(FindResource,LoadResource等)来查找图像。如果我在应用程序目录中设置本地文件并加载它,它可以工作,但它会在程序目录中创建一个虚拟文件。我已经提出了一些实现这一点的想法,我希望你能给我一些评论。

  1. 从资源加载虚拟html文件,动态添加html并从mshtml挂钩,FindResource,LoadResource等,并提供文件名,文件大小,内容
  2. 使用Regex过滤器查找src属性并使用file:// protocol
  3. 连接目录名称
  4. 使用html解析器遍历DOM并更改src属性。
  5. 感谢。

2 个答案:

答案 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();
    }
}