将 IHTMLDocument2 实例分配给 TWebBrowser 实例
Assigning IHTMLDocument2 instance to a TWebBrowser instance
我正在使用 IHTMLDocument2
接口的实例来解析某些 HTML,如 post:
中所述
代码比较简单:
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
或其他一些方法来这样做,但是如果可能的话,可能会比简单地将指针分配给已经初始化的对象有一些性能损失。换句话说,我只是想在排序的“后台缓冲区”中“显示”/“渲染”我刚刚解析的内容。
是否需要在调用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
接口的实例来解析某些 HTML,如 post:
代码比较简单:
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
或其他一些方法来这样做,但是如果可能的话,可能会比简单地将指针分配给已经初始化的对象有一些性能损失。换句话说,我只是想在排序的“后台缓冲区”中“显示”/“渲染”我刚刚解析的内容。是否需要在调用
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;