0

この投稿で説明されているように、インターフェイスのインスタンスを使用してIHTMLDocument2HTML を解析しています。

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

完了したら、上記で新しく変更した HTML コンテンツを保存し、HTML を にdiDoc2ロードしますTWebBrowser

  1. 代わりに、上記で既に解析された を に含まれている にIHTMLDocument2直接「割り当てる」ことができますか?これは、はるかに高速な方法のようです。おそらくまたは他の方法を使用してそうすることができますが、最初に可能であれば、既に初期化されたオブジェクトにポインターを割り当てるよりもパフォーマンスが低下する可能性があります。言い換えれば、ソートの「バックバッファー」で解析したばかりのものを「表示」/「レンダリング」したいだけです。IHTMLDocument2TWebBrowserIHTMLDocument2.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 に答える