我正在尝试从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();
答案 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();
答案 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);