本文介绍了将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中。

  1. 是否可以将上面已经解析的IHTMLDocument2直接赋值给TWebBrowser中包含的IHTMLDocument2,这似乎是一种更快的方法。我可以使用可能的IHTMLDocument2.write或其他一些方法来这样做,但与简单地将指针分配给已经初始化的对象相比,可能会有一些性能损失,如果这在一开始就是可能的话。换句话说,我只是想呈现我刚才在排序的&q;后台缓冲区中解析的内容。

  2. 是否需要在调用CoCreateInstance前后分别调用CoInitializeCoUninitialize?我见过一些代码可以做到这一点,但没有它也可以工作,除非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*)&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;

这篇关于将IHTMLDocument2实例分配给TWebBrowser实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 17:32