我正在使用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内容,并将其加载到TWebBrowser中。
IHTMLDocument2直接分配给包含在TWebBrowser中的IHTMLDocument2,这样做似乎要快得多。我可能会使用IHTMLDocument2.write或其他一些方法来做到这一点,但如果可能的话,可能会有一些性能损失,而不是简单地将指针分配给已经初始化的对象。换句话说,我只是想要“显示”/“呈现”我刚才在排序的“后退缓冲区”中解析的内容。CoCreateInstance打电话之前和之后是否需要打电话给CoInitialize和CoUninitialize?我已经看到了一些代码,但是没有它它就能工作,除非Delphi/C++ Builder做一些底层的initialization.。
发布于 2021-10-21 11:55:10
我使用了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;https://stackoverflow.com/questions/69554315
复制相似问题