2009-04-07 4 views
4

J'essaie de créer un objet document mshtml à partir d'un tampon html. Mais lorsque le code suivant est exécuté, il appelle la fenêtre Internet Explorer. Comment puis-je l'empêcher d'invoquer IE?problème avec IHTMLDocument2 :: write()

#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

Que vous essayez d'accomplir? Avez-vous remarqué que si vous supprimez le javascript, IE n'est pas lancé? – rec

+0

J'écrivais une application pour analyser les pages Web en utilisant l'interface IHTMLDocument2. J'ai observé que lorsque j'analyser certaines pages web qui contins java script, il invoquait la fenêtre IE de mon application. Fondamentalement, je veux analyser les pages Web en silence en utilisant IHTMLDocument2. –

Répondre

1

Veuillez essayer les codes ci-dessous.

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); 
+1

+1 C'est beaucoup mieux que 'write()' :) – CodeAngry

+1

Avec IpersistStreamInit.Load etc, le DOM n'est pas disponible, vous devez attendre readystate == complete (ou l'événement correspondant), et cela ne ne semble pas se produire sans les messages Windows de traitement du thread appelant. – peterchen

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(); 

se réfèrent: http://www.codeguru.com/cpp/i-n/ieprogram/article.php/c4385/Lightweight-HTML-Parsing-Using-MSHTML.htm#more