关于IViewObject2接口的问题

zipzipzipzip 2006-11-21 09:55:50
我使用下面的代码,想得到IViewObject2的接口,但是失败了,hr = E_NOINTERFACE...
那位高手能告诉我为什么,应该如何正确得到?
hr = m_pBrowser->QueryInterface(IID_IViewObject2,
(void**)&pViewObject);
...全文
395 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zipzipzipzip 2006-11-21
  • 打赏
  • 举报
回复
代码也是从网上找到的:
IHTMLDocument3* pDocument3 = NULL;
IHTMLDocument2* pDocument = NULL;
IHTMLElement2* pElement2 = NULL;
IHTMLElement* pElement = NULL;
IViewObject2* pViewObject = NULL;
IDispatch* pDispatch = NULL;
IDispatch* pWebBrowserDisp = NULL;

HRESULT hr;
long bodyHeight;
long bodyWidth;
long rootHeight;
long rootWidth;
long height;
long width;

hr = m_pBrowser->get_Document(&pDispatch);

if (FAILED(hr))
return true;

hr = pDispatch->QueryInterface(IID_IHTMLDocument2,
(void**)&pDocument);

if (FAILED(hr))
return true;

hr = pDocument->get_body(&pElement);

if (FAILED(hr))
return true;

hr = pElement->QueryInterface(IID_IHTMLElement2, (void**)&pElement2);

if (FAILED(hr))
return true;

hr = pElement2->get_scrollHeight(&bodyHeight);

if (FAILED(hr))
return true;

hr = pElement2->get_scrollWidth(&bodyWidth);

if (FAILED(hr))
return true;

hr = pDispatch->QueryInterface(IID_IHTMLDocument3,
(void**)&pDocument3);

if (FAILED(hr))
return true;

hr = pDocument3->get_documentElement(&pElement);

if (FAILED(hr))
return true;

hr = pElement->QueryInterface(IID_IHTMLElement2, (void**)&pElement2);

if (FAILED(hr))
return true;

hr = pElement2->get_scrollHeight(&rootHeight);

if (FAILED(hr))
return true;

hr = pElement2->get_scrollWidth(&rootWidth);

if (FAILED(hr))
return true;

width = bodyWidth;
height = rootHeight > bodyHeight ? rootHeight : bodyHeight;


hr = pDispatch->QueryInterface(IID_IViewObject2, (void **)&pViewObject);

if (FAILED(hr))
return true;

HDC hdcMain = GetDC( m_hWnd );
HDC hdcMem = CreateCompatibleDC(hdcMain);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcMain, width, height);
SelectObject(hdcMem, hBitmap);

RECTL rcBounds = { 0, 0, width, height };
hr = pViewObject->Draw(DVASPECT_CONTENT, -1, NULL, NULL, hdcMain,
hdcMem, &rcBounds, NULL, NULL, 0);

if (SUCCEEDED(hr))
{
CImage image;
image.Create(width, height, 24);
CImageDC imageDC(image);
::BitBlt(imageDC, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
image.Save(m_strDestFilename);
}

pViewObject->Release();
lion_wing 2006-11-21
  • 打赏
  • 举报
回复
你后面的代码贴出来看看
zipzipzipzip 2006-11-21
  • 打赏
  • 举报
回复
试了,还是老样子,页面已经出来了,可还是不能画出来
lion_wing 2006-11-21
  • 打赏
  • 举报
回复
try it like this:

IWebBrowser2* m_pBrowser;
CoCreateInstance( CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, ( void** ) &m_pBrowser );
pBrowser->put_Visible(VARIANT_TRUE);

CComVariant d = "about:blank";
CComVariant t = 2;
CComVariant v = "";
CComVariant p = "";
CComVariant h = "";
pBrowser->Navigate2(&d,&t,&v,&p,&h);

IDispatch *pIDispatch = NULL;
m_pBrowser->get_Document(&pIDispatch);
pIDispatch->QueryInterface(IID_IViewObject2, (void **)&pIViewObject);
zipzipzipzip 2006-11-21
  • 打赏
  • 举报
回复
用了楼上的兄台的方法的确可以取到,但是@err得到错误 14000:申请的节不存在于激活上下文。
之后hr = pViewObject->Draw(DVASPECT_CONTENT, 1, NULL, NULL, hdcMain, hdcMem, &rcBounds, NULL, NULL, 0); 也失败了,hr= 0x800703f0 试图引用不存在的令牌。
不知道是什么原因,郁闷了。。。
lion_wing 2006-11-21
  • 打赏
  • 举报
回复
IWebBrowser2* m_pBrowser;
CoCreateInstance( CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, ( void** ) &m_pBrowser );

IDispatch *pIDispatch = NULL;

m_pBrowser->get_Document(&pIDispatch);

pIDispatch->QueryInterface(IID_IViewObject2, (void **)&pIViewObject);
蒋晟 2006-11-21
  • 打赏
  • 举报
回复
Internet Explorer does not support this interface.
zipzipzipzip 2006-11-21
  • 打赏
  • 举报
回复
不使用MFC和ATL
zipzipzipzip 2006-11-21
  • 打赏
  • 举报
回复
IWebBrowser2* m_pBrowser;
CoCreateInstance( CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, ( void** ) &m_pBrowser );
蒋晟 2006-11-21
  • 打赏
  • 举报
回复
is m_pBrowser an ActiveX control?
zipzipzipzip 2006-11-21
  • 打赏
  • 举报
回复
顶一下

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧