I do it in this way.
IViewObject2* view = 0;
IWebBrowser2* wbb = 0;
unsigned int connid = 0;
IOleObject* oleo = 0;
IOleInPlaceObject* oipo = 0;
iOleClientSite* iolesite = 0;
RECT rc = {0,0,100,100};
MSG msg; memset(&msg,0,sizeof(msg));
Empty();
iolesite = new iOleClientSite; if(!iolesite) return E_OUTOFMEMORY;
if(S_OK==(hr=CoCreateInstance(IID_IInternetExplorer,0,CLSCTX_INPROC_SERVER,IID_IWebBrowser2,(void**)&wbb)))
{
if(S_OK==wbb->QueryInterface(IID_IOleObject,(void**)&oleo))
{
oleo->SetClientSite(iolesite);
connid = ConnectSink(oleo,IID_DWebBrowserEvents2,(bUnk*)iolesite);
oleo->DoVerb(OLEIVERB_INPLACEACTIVATE,&msg,iolesite,0,iolesite->_hwnd,&rc);
oleo->Release(); oleo = 0;
iolesite->Resize(wbb,_sil.cx,_sil.cy);
}
{
tArr<unsigned short> wstr(8+strlen(file)); MultiByteToWideChar(0,0,file,1+strlen(file),wstr.array,wstr.count);
VARIANT v; v.vt = VT_BSTR; v.bstrVal = SysAllocString(wstr.array);
VARIANT i; i.vt = VT_INT; i.lVal = 0;
READYSTATE ready;
hr = wbb->Navigate2(&v,&i,0,0,0);
while((S_OK==wbb->get_ReadyState(&ready)) && (READYSTATE_COMPLETE!=ready) && GetMessage(&msg,0,0,0))
{
DispatchMessage(&msg);
}
VariantClear(&v);
VariantClear(&i);
}
IDispatch* app = 0;
if((S_OK==hr) && (S_OK==wbb->get_Document(&app)) )
{
if(app)
{
_Object obj(app,1);
int cxy = 0;
int cxr = 0;
int cyr = 0;
if(obj["body"].get("scrollHeight",cxy)) _sil.cy = cxy+cyr;
if(obj["body"].get("scrollWidth" ,cxy)) _sil.cx = cxy+cxr;
TRACE("document.body.scrollWidth = %i\r\ndocument.body.scrollHeight = %i\r\n",_sil.cx,_sil.cy);
iolesite->Resize(wbb,_sil.cx,_sil.cy);
if(obj["body"].get("scrollHeight",cxy)) _sil.cy = cxy+cxr;
if(forcecx) _sil.cx = forcecx;
iolesite->Resize(wbb,_sil.cx,_sil.cy);
if(S_OK==app->QueryInterface(IID_IViewObject2,(void**)&view))
{
HDC hdcm = CreateCompatibleDC(0);
RECTL rcbound = { 0,0,_sil.cx,_sil.cy };
HGDIOBJ obmp;
BITMAPINFO bmi;
unsigned int bpl;
if(forcecy) _sil.cy = min(_sil.cy,forcecy);
bmi.bmiHeader.biSize = sizeof(bmi);
bmi.bmiHeader.biWidth = _sil.cx;
bmi.bmiHeader.biHeight = _sil.cy;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = 0;
bpl = (((bmi.bmiHeader.biWidth*bmi.bmiHeader.biBitCount)>>3)+3)&~3;
bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biHeight*bpl;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
_hbmp = CreateDIBSection(hdcm,&bmi,DIB_RGB_COLORS,0,0,0);
obmp = SelectObject(hdcm,_hbmp);
hr = view->Draw(DVASPECT_CONTENT,-1,0,0,0,hdcm,&rcbound,0,__fnContDraw,0);
SelectObject(hdcm,obmp);
DeleteDC(hdcm);
view->Release(); view = 0;
}
app->Release(); app = 0;
}
}
if(S_OK==wbb->QueryInterface(IID_IOleObject,(void**)&oleo))
{
DisconnectSink(oleo,IID_DWebBrowserEvents2,(bUnk*)iolesite,connid);
oleo->SetClientSite(0);
oleo->Release(); oleo = 0;
}
wbb->Release();
}
iolesite->Release();