首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IHTMLDocument2实例分配给TWebBrowser实例

将IHTMLDocument2实例分配给TWebBrowser实例
EN

Stack Overflow用户
提问于 2021-10-13 11:01:46
回答 1查看 178关注 0票数 0

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

Load from IPersistMoniker takes long time to load unresolvable URL

代码相对简单:

代码语言:javascript
复制
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中。

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

  1. 在给CoCreateInstance打电话之前和之后是否需要打电话给CoInitializeCoUninitialize?我已经看到了一些代码,但是没有它它就能工作,除非Delphi/C++ Builder做一些底层的initialization.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-21 11:55:10

我使用了IHTMLDocument2.write,它看起来很好用。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69554315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档