From: Fede on
Hi Everyone,

It is my first post in this group and I would appreciate some help in
making IViewObject:Draw / IWebbrowser2 / IHTMLDocument2 interfaces.
The moment I call the IViewObject:Draw interface it returns E_FAIL. I
am working in plain C and COM (no ATL/MFC/etc.).

In a nutshell, this is the code:

IWebBrowser2* pWBApp = NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_InternetExplorer,
NULL,
CLSCTX_SERVER,
IID_IWebBrowserApp,
(LPVOID*)&pWBApp);
BSTR bstrURL = SysAllocString(L"www.google.com");
.....
hresult = pWBApp->Navigate(bstrURL, &vFlags,
&vTargetFrameName, &vPostData, &vHeaders);
pWBApp->put_Visible(VARIANT_TRUE);
HRESULT hr;
IDispatchPtr spDisp1;
hr = pWBApp->get_Document(&spDisp1);
IHTMLDocument2 * pHtmlDoc = NULL;
hr = spDisp1->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc);
IViewObject* vo;
hr = pHtmlDoc->QueryInterface(__uuidof(IViewObject), (void **)&vo);
RECTL rect;
pWBApp->get_Width(&m_width);
pWBApp->get_Height(&m_height);
rect.bottom = m_height;
rect.left = 0;
rect.right = m_width;
rect.top = 0;
long l;
hr = pWBApp->get_HWND(&l);
HDC hScreenDC = ::GetDC((HWND) l);
hMemDC = CreateCompatibleDC(hScreenDC);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, m_width, m_height);
SelectObject(hMemDC, hBitmap);
hr = vo->Draw(DVASPECT_CONTENT, 1, NULL, NULL, 0, hMemDC, &rect, NULL,
NULL, 0); =>> RETURNS E_FAIL

Thanks!!

Fede




From: Igor Tandetnik on
Fede <federico.sucari(a)gmail.com> wrote:
> It is my first post in this group and I would appreciate some help in
> making IViewObject:Draw / IWebbrowser2 / IHTMLDocument2 interfaces.
> The moment I call the IViewObject:Draw interface it returns E_FAIL. I
> am working in plain C and COM (no ATL/MFC/etc.).
>
> In a nutshell, this is the code:
>
> IWebBrowser2* pWBApp = NULL;
> CoInitialize(NULL);
> CoCreateInstance(CLSID_InternetExplorer,
> NULL,
> CLSCTX_SERVER,
> IID_IWebBrowserApp,
> (LPVOID*)&pWBApp);

You are creating a standalone instance of Internet Explorer, in a
separate process. IViewObject is not marshallable, it doesn't work
across a process boundary. What you are trying to do has any hope of
working only if you host an instance of WebBrowser control in-process.

In addition, you are requesting IWebBrowserApp pointer, but storing it
in a IWebBrowser2* variable. This is an illegal downcast. The IID and
the variable type have to match.
--
With best wishes,
Igor Tandetnik

With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925