IHTMLDocument2 :: write()的问题

时间:2009-04-07 09:04:42

标签: c++ com mfc vc6 mshtml

我正在尝试从html缓冲区创建一个mshtml文档对象。但是当执行以下代码时,它正在调用Internet Explorer窗口。如何阻止它调用IE。

#include <atlbase.h>
#include <mshtml.h>


CoInitialize(NULL);

CString strHTMLCode = _T("<html><head><script language=\"JavaScript\">{top.location.href=\"index.php\"}</script></head><body></body></html>");

CComPtr<IHTMLDocument2> pDoc;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (void**)&pDoc);

SAFEARRAY* psa = SafeArrayCreateVector(VT_VARIANT, 0, 1);
VARIANT *param;

hr = SafeArrayAccessData(psa, (LPVOID*)¶m);
param->vt = VT_BSTR;
param->bstrVal = strHTMLCode.AllocSysString();

hr = pDoc->write(psa); //This line invoks internet explorer window.
hr = pDoc->close();

2 个答案:

答案 0 :(得分:3)

OLECHAR szHTML[] = OLESTR("<HTML><BODY>Hello World!</BODY></HTML>");

IHTMLDocument2 *pDoc = NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_HTMLDocument,
               NULL,
               CLSCTX_INPROC_SERVER,
               IID_IHTMLDocument2,
               (LPVOID *)&pDoc);
if(pDoc)
{
    IPersistStreamInit *pPersist = NULL;
    pDoc->QueryInterface(IID_IPersistStreamInit, (LPVOID *) &pPersist);
    if(pPersist)
    {
        IMarkupServices *pMarkSvr = NULL;
        pPersist->InitNew();
        pPersist->Release();
        pDoc->QueryInterface(IID_IMarkupServices, (LPVOID *)&pMarkSvr);
        if(pMarkSvr)
        {
            IMarkupContainer *pMkContainer = NULL;
            IMarkupPointer *pMkStart = NULL;
            IMarkupPointer *pMkFinish = NULL;
            pMarkSvr->CreateMarkupPointer(&pMkStart);
            pMarkSvr->CreateMarkupPointer(&pMkFinish);
            pMarkSvr->ParseString(szHTML, 0, &pMkContainer, pMkStart, pMkFinish);
            if(pMkContainer)
            {
                IHTMLDocument2 *pNewDoc = NULL;
                pMkContainer->QueryInterface(IID_IHTMLDocument, (LPVOID *)&pNewDoc);
                if(pNewDoc)
                {
                    // do anything with pNewDoc, in this case
                    // get the body innerText.
                    IHTMLElement *pBody;
                    pNewDoc->get_body(&pBody);
                    if(pBody)
                    {
                        BSTR strText;
                        pBody->get_innerText(&strText);
                        ShowMessage(strText);
                        pBody->Release();
                        SysFreeString(strText);
                    }
                    pNewDoc->Release();
                }
                pMkContainer->Release();
            }
            if(pMkStart)
                pMkStart->Release();
            if(pMkFinish)
                pMkFinish->Release();
            pMarkSvr->Release();
        }
    }
    pDoc->Release();
}
CoUninitialize();

参考:http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4385/Lightweight-HTML-Parsing-Using-MSHTML.htm#more

答案 1 :(得分:1)

请尝试以下代码。

CoInitialize(NULL);

CString strHTMLCode = "...";
CComPtr<IHTMLDocument2> pDoc;
HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER, IID_IHTMLDocument2, (void**)&pDoc);

// get persist stream init
ComQIPtr<IPersistStreamInit> psi = doc;

// allocate memory
HGLOBAL hMem = ::GlobalAlloc(GPTR, strHTMLCode.GetLength() * sizeof(TCHAR));
::GlobalLock(hMem);
::CopyMemory(hMem, (LPCTSTR)strHTMLCode, strHTMLCode.GetLength() *  * sizeof(TCHAR));

// create stream
IStream* stream = NULL;
HRESULT hr = ::CreateStreamOnHGlobal(hMem, FALSE, &stream);
if (SUCCEEDED(hr))
{
    // load html string
    psi->Load(stream);
    stream->Release();
}

// free memory
::GlobalUnlock(hMem);
::GlobalFree(hMem);