我的程序在执行到IHTMLelement::get_outerHTML 弹出上面的错误提示 ,下面是部分代码 
        CComBSTR BStrhtml=""; 
        IHTMLElement* pEle; 
                    ......获取pEle..... 
        pEle->get_outerHTML(&BStrhtml); 我用两种方法测试,有一种方法没有错误提示,另一个有错. 
1种是. 用CoCreateInstance 创建 IWebBrowserapp 然后得到IHTMLElement 指针,再pEle->get_outerHTML,这样做没错误提示, 
IWebBrowser2* pWBApp ; 
CoCreateInstance(CLSID_InternetExplorer, NULL,CLSCTX_SERVER, 
IID_IWebBrowserApp, (LPVOID*)&pWBApp); 
2种是 从CHTMLview  得到IWebBrowser2 ,然后得到IHTMLElement ,但在pEle->get_outerHTML 时出错,unhandled exception : mshtml.dll 0xc0000005 access violation 
CHTMLview *pView ; 
........get pView pointer.... 
IWebBrowser2* pWBApp =(IWebBrowser2*)pView->GetApplication(); 
我检查了两种情况下的内存使用情况,但我不知怎么处理
1种情况下mshtml address 0x42990000-42d03fff 
EAX = 00000000 EBX = 09FA0370 ECX = 0C42172C EDX = 0D92EE18(不在mshtml 的内存使用区里.没发现错误) 
 ESI = 0D92EE94 EDI = 0D92EFA8 
 EIP = 00485FA2 ESP = 0D92EE94 EBP = 0D92EFB4 EFL = 00000246 
2种情况下GetApplication form chtmlview 
mshtml address 0x42990000-42d03fff 
 EAX = 00000000 EBX = 01A371B8 ECX = 00000000 EDX = 42A58288(在mshtml 的内存使用区,出错了) 
 ESI = 0BC7F8B0 EDI = 0BC7F9A4 
 EIP = 0047F108 ESP = 0BC7F8B0 EBP = 0BC7F9B0 EFL = 00000246 
不知如何处理后面一种情况下的错误,上面的两种方法中其它公用代码是一样的,就是得到IWebBrowser2* 接口指针上不同.现在我必须用后面这种方法,有没人知道我的问题怎么解决.
先谢谢了.

解决方案 »

  1.   

    pView->GetApplication();返回的是IDispatch*,COM接口指针都不能强制转换类型,必须用QueryInterface来得到IWebBrowser2*,可以这样:
    CComQIPtr<IWebBrowser2> pWBApp = pView->GetApplication();其次,如果想访问DOM,没必要从IWebBrowser2开始,可以用pView->GetHtmlDocument()从IHTMLDocument2开始:
    CComQIPtr<IHTMLDocument2> pDoc2 = pView->GetHtmlDocument();
      

  2.   

    to jameshooo:
    还是不行.
    IDispatch* papp=pView->GetApplication();
    papp->QueryInterface(IID_IWebBrowser2, (void**)pWBApp); pWBApp没有成功??用你上面的方法可以获得接口,但最后get_outerHTML 同样出错
      

  3.   

    为什么从chtmlview得到的IDispatch不能QueryInterface
      

  4.   

    我不知道你是怎么用的,必须获得IHTMLDocument2指针,然后通过IHTMLDocument2::get_documentElement属性获得元素指针,再用元素的get_outerHTML得到字符串。
    不能直接通过IWebBrowser2或者IHTMLDocument2来获得outerHTML