本文介绍了将IHTMLDocument2实例分配给TWebBrowser实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用IHTMLDocument2
接口的一个实例来解析一些HTML,如本文所述:
Load from IPersistMoniker takes long time to load unresolvable URL
代码比较简单:
DelphiInterface<IHTMLDocument2> diDoc2;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (LPVOID*)&diDoc2);
// Load and process HTML here and save into memory stream or to disk after the processing is done
完成后,我保存上面新修改的diDoc2
的HTML内容,并将该HTML加载到TWebBrowser
中。
是否可以将上面已经解析的
IHTMLDocument2
直接赋值给TWebBrowser
中包含的IHTMLDocument2
,这似乎是一种更快的方法。我可以使用可能的IHTMLDocument2.write
或其他一些方法来这样做,但与简单地将指针分配给已经初始化的对象相比,可能会有一些性能损失,如果这在一开始就是可能的话。换句话说,我只是想呈现我刚才在排序的&q;后台缓冲区中解析的内容。是否需要在调用
CoCreateInstance
前后分别调用CoInitialize
和CoUninitialize
?我见过一些代码可以做到这一点,但没有它也可以工作,除非Delphi/C++Builder做一些底层的初始化。
推荐答案
我使用了IHTMLDocument2.write
,它似乎运行良好。
WideString HTML = "<html><body>test</body></html>";
if (diDoc)
{
// Creates a new one-dimensional array
SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT,0,1);
if (psaStrings)
{
VARIANT *param;
BSTR bstr = SysAllocString(HTML.c_bstr());
SafeArrayAccessData(psaStrings, (LPVOID*)¶m);
param->vt = VT_BSTR;
param->bstrVal = bstr;
SafeArrayUnaccessData(psaStrings);
diDoc->write(psaStrings);
diDoc->close();
// SafeArrayDestroy calls SysFreeString for each BSTR
//SysFreeString(bstr); // SafeArrayDestroy should be enough
SafeArrayDestroy(psaStrings);
return S_OK;
}
}
return E_FAIL;
这篇关于将IHTMLDocument2实例分配给TWebBrowser实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!