0

我正在使用该IHTMLDocument2接口的一个实例来解析一些 HTML,如本文所述:

从 IPersistMoniker 加载需要很长时间才能加载无法解析的 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.

  1. 我是否可以将IHTMLDocument2上面已经解析的内容直接“分配”给IHTMLDocument2包含在 中的内容TWebBrowser,这似乎是一种更快的方法。我可以使用可能IHTMLDocument2.write或其他方法来做到这一点,但是如果首先可能的话,可能会比简单地分配一个指向已经初始化的对象的指针有一些性能损失。换句话说,我只是想“显示”/“渲染”我刚刚在排序的“后台缓冲区”中解析的内容。

  2. 是否需要打电话CoInitialize和打电话CoUninitialize之前和之后CoCreateInstance?我见过一些代码可以做到这一点,但没有它也可以工作,除非 Delphi/C++ Builder 做一些底层初始化。

4

1 回答 1

0

我用过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*)&param);
        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;
于 2021-10-21T11:55:10.250 回答