怎样将一段内存中的HTML在CHtmlView中显示出来?我用下面的代码不行,在我标记的地方退出.
MSHTML::IHTMLDocument2PtrptrDoc;
LPCTSTRsz=_T("<html><head><title>test</title></head><body><h1>Inmemory HTML document</h1></body></html>");
HGLOBALhMem;
LPSTREAMpStream;
IPersistStreamInit*pPersistStream;
ptrDoc = GetHtmlDocument();
hMem = ::GlobalAlloc(GPTR, (lstrlen(sz) + 1) * sizeof TCHAR);
lstrcpy((LPTSTR)hMem, sz);
HRESULT hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
if(FAILED(hr))
{
::GlobalFree(hMem);
return;
}
hr = ptrDoc.QueryInterface(IID_IPersistStreamInit, &pPersistStream);
if(FAILED(hr))
{
::GlobalFree(hMem); //能运行到这里,说明GetHtmlDocument()返回的对象没有IID_IPersistStreamInit接口,没道理呀!
return;
}
if(pPersistStream == NULL)
{
pStream->Release();
return;
}
hr = pPersistStream->InitNew();
hr = pPersistStream->Load(pStream);
hr = pPersistStream->Release();
pStream->Release();
MSHTML::IHTMLDocument2PtrptrDoc;
LPCTSTRsz=_T("<html><head><title>test</title></head><body><h1>Inmemory HTML document</h1></body></html>");
HGLOBALhMem;
LPSTREAMpStream;
IPersistStreamInit*pPersistStream;
ptrDoc = GetHtmlDocument();
hMem = ::GlobalAlloc(GPTR, (lstrlen(sz) + 1) * sizeof TCHAR);
lstrcpy((LPTSTR)hMem, sz);
HRESULT hr = ::CreateStreamOnHGlobal(hMem, TRUE, &pStream);
if(FAILED(hr))
{
::GlobalFree(hMem);
return;
}
hr = ptrDoc.QueryInterface(IID_IPersistStreamInit, &pPersistStream);
if(FAILED(hr))
{
::GlobalFree(hMem); //能运行到这里,说明GetHtmlDocument()返回的对象没有IID_IPersistStreamInit接口,没道理呀!
return;
}
if(pPersistStream == NULL)
{
pStream->Release();
return;
}
hr = pPersistStream->InitNew();
hr = pPersistStream->Load(pStream);
hr = pPersistStream->Release();
pStream->Release();
回复人:allenq(黑夜给我黑的眼, 我却用他来翻白眼..........) 四级(中级) 信誉:99 2004-9-6 11:57:08 得分:5 |
帮你顶.. |
TOP |
回复人:jiangsheng(蒋晟.MSMVP2004Jan) 五星(高级) 信誉:257 2004-9-7 2:51:22 得分:25 |
http://dev.csdn.net/article/18/18465.shtm 从Microsoft Internet Explorer 5开始,多于一次调用 IPersist* 接口的Load 方法 是可行的。在更早的版本中,每个MSHTML的实例只支持一次Load 调用。 已知问题 微软知识库文章 Q271868 在Microsoft Internet Explorer (Programming) 5.5中,框架对象不支持IPersistStream, IPersistFile,IPersistMemory接口。 Q323569 BUG: PersistStreamInit::Load() 显示HTML内容为文本 Q264868 BUG:Internet Explorer 没有检测到内容类型从text/html到text/xml的改变。 |
TOP |
回复人:Aspist(边城浪子) 三级(初级) 信誉:90 2004-9-7 9:26:12 得分:0 |
我的机器是IE6呀,应该可以吧: #include "mshtml.h" #import "C:/windows/system32/mshtml.tlb" 到底要怎样才行呢? |
TOP |
回复人:Semigod() 两星(中级) 信誉:93 2004-9-7 9:56:42 得分:20 |
我来给出一段代码: HRESULT CClientView::LoadFromStream(IStream* pStream) { HRESULT hr; IDispatch* pHtmlDoc = NULL; IPersistStreamInit* pPersistStreamInit = NULL; // 获取HTML文档对象 pHtmlDoc = GetHtmlDocument(); if (pHtmlDoc == NULL) return false; // 获取接口 IPersistStreamInit. using namespace MSXML2; hr = pHtmlDoc->QueryInterface( IID_IPersistStreamInit, (void**)&pPersistStreamInit ); pHtmlDoc->Release(); if ( SUCCEEDED(hr) ) { // 初始化文档 hr = pPersistStreamInit->InitNew(); if ( SUCCEEDED(hr) ) { // 加载数据流中的数据 hr = pPersistStreamInit->Load( pStream ); return S_OK; } pPersistStreamInit->Release(); } return E_FAIL; } |
TOP |
回复人:Semigod() 两星(中级) 信誉:93 2004-9-7 9:59:08 得分:0 |
再给出一段: CStreamOnCString streamHtml(html); IStream * pIStream; hr = streamHtml.QueryInterface(IID_IStream, (void **)&pIStream); if (SUCCEEDED(hr)) { LoadFromStream(pIStream); pIStream->Release(); } 这段代码使用了CHtmlView中的CStreamOnCString类来将HTML加载到CHtmlView中(利用前面给出的LoadFromStream方法) |
TOP |
回复人:Aspist(边城浪子) 三级(初级) 信誉:90 2004-9-7 11:09:15 得分:0 |
谢谢两位,其实是ptrDoc = GetHtmlDocument();返回的是空,在前面加上 Navigate2( _T("about:blank"), NULL, NULL, NULL, NULL );就好了. |
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=442159