c++ - problema con IHTMLDocument2:: write()
com mfc (2)
Estoy tratando de crear un objeto de documento mshtml desde un búfer html. Pero cuando se ejecuta el siguiente código, está invocando la ventana de Internet Explorer. ¿Cómo evito que invoque 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();
Por favor, prueba los códigos a continuación.
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);
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();