пытаюсь использовать компонент WebBrowser, не используя MFC, ATL | Код | #include <windows.h> #include <exdisp.h>
class OleInPlaceSite : public IOleInPlaceSite { public: /****************** IUnknown ***************************************************/ HRESULT __stdcall QueryInterface( REFIID riid, void** ppvObject ) { if( !ppvObject ) return E_POINTER; if( riid==IID_IUnknown || riid==IID_IOleWindow || riid==IID_IOleInPlaceSite ) return *ppvObject = (void*)this, S_OK; *ppvObject = NULL; return E_NOINTERFACE; } ULONG __stdcall AddRef() { return 1; /*one instance*/ } ULONG __stdcall Release() { return 1; /*one instance*/ } /********************* IOleWindow ***********************************************/ HRESULT __stdcall GetWindow( HWND *phwnd ) { return phwnd?(*phwnd = this->hwnd, S_OK):E_INVALIDARG; } HRESULT __stdcall ContextSensitiveHelp( BOOL ) { return S_OK; } /********************* IOleInPlaceSite ******************************************/ HRESULT __stdcall CanInPlaceActivate() { return S_OK; } HRESULT __stdcall OnInPlaceActivate() { return S_OK; } HRESULT __stdcall OnUIActivate() { return S_OK; } HRESULT __stdcall GetWindowContext( IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { if( !(ppFrame && ppDoc && lprcPosRect && lprcClipRect && lpFrameInfo) ) return E_INVALIDARG;
*ppFrame = NULL; *ppDoc = NULL;
GetClientRect( this->hwnd, lprcPosRect ); GetClientRect( this->hwnd, lprcClipRect );
lpFrameInfo->fMDIApp = false; lpFrameInfo->hwndFrame = this->hwnd; lpFrameInfo->haccel = 0; lpFrameInfo->cAccelEntries = 0;
return S_OK; } HRESULT __stdcall Scroll( SIZE ) { return S_OK; } HRESULT __stdcall OnUIDeactivate( BOOL ) { return S_OK; } HRESULT __stdcall OnInPlaceDeactivate() { return S_OK; } HRESULT __stdcall DiscardUndoState() { return S_OK; } HRESULT __stdcall DeactivateAndUndo() { return S_OK; } HRESULT __stdcall OnPosRectChange( LPCRECT ) { return S_OK; }
public: HWND hwnd; };
class OleClientSite : public IOleClientSite { public: /****************** IUnknown ***************************************************/ HRESULT __stdcall QueryInterface( REFIID riid, void** ppvObject) { if( !ppvObject ) return E_POINTER; if( riid==IID_IUnknown || riid==IID_IOleClientSite ) return *ppvObject = (void*)this, S_OK; if( riid==IID_IOleInPlaceSite ) return *ppvObject = (void*)&oleInPlaceSite, S_OK; *ppvObject = NULL; return E_NOINTERFACE; } ULONG __stdcall AddRef() { return 1; /*one instance*/ } ULONG __stdcall Release() { return 1; /*one instance*/ } /*************************************** IOleClientSite ***************************************/ HRESULT __stdcall SaveObject() { return S_OK; } HRESULT __stdcall GetMoniker( DWORD, DWORD, IMoniker **ppmk ) { return *ppmk = NULL, E_NOTIMPL; } HRESULT __stdcall GetContainer( IOleContainer** ppContainer ) { return *ppContainer=NULL, E_NOINTERFACE; } HRESULT __stdcall ShowObject() { return S_OK; } HRESULT __stdcall OnShowWindow( BOOL ) { return S_OK; } HRESULT __stdcall RequestNewObjectLayout() { return E_NOTIMPL; }
public: OleInPlaceSite oleInPlaceSite; };
bool EmbedBrowser(HWND hwnd) { OleClientSite* wndData = new OleClientSite; wndData->oleInPlaceSite.hwnd = hwnd;
SetWindowLong(hwnd,GWL_USERDATA,(LONG)wndData);
HRESULT r;
IWebBrowser2* webBrowser; r=CoCreateInstance( CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (void**)&webBrowser );
IOleObject* oleObject; r=webBrowser->QueryInterface( IID_IOleObject, (void**)&oleObject );
r=OleSetContainedObject( webBrowser, true );
r=oleObject->SetClientSite( wndData );
RECT rect; GetClientRect( hwnd, &rect ); r=oleObject->DoVerb( OLEIVERB_INPLACEACTIVATE, NULL, wndData, 0, hwnd, &rect );
oleObject->Release();
BSTR url = SysAllocString( L"ya.ru" ); VARIANT empty; VariantInit(&empty); r=webBrowser->Navigate( url, &empty,&empty,&empty,&empty ); SysFreeString( url );
webBrowser->Release();
return true; }
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { if( uMsg==WM_INITDIALOG ) { return EmbedBrowser(hwndDlg); } else if( uMsg==WM_CLOSE ) { return EndDialog(hwndDlg,0); } return false; }
int __stdcall WinMain(HINSTANCE,HINSTANCE,LPSTR,int) { //CoInitializeEx( 0, 0/*COINIT_MULTITHREADED*/ ); // вместо CoInitializeEx надо OleInitialize чтобы работала OleSetContainedObject OleInitialize(0);
struct DialogTemplate { DLGTEMPLATE tmpl; WORD stuff[3]; } dialogTemplate = {0}; dialogTemplate.tmpl.style = WS_CAPTION+WS_POPUP+WS_SYSMENU+DS_MODALFRAME; dialogTemplate.tmpl.x = 100; dialogTemplate.tmpl.y = 100; dialogTemplate.tmpl.cx = 300; dialogTemplate.tmpl.cy = 200; DialogBoxIndirectParamA( 0,(LPCDLGTEMPLATE)&dialogTemplate.tmpl, 0, &DialogProc, 0);
CoUninitialize(); }
|
почему-то WebBrowser не встраивается в окно, а создается как отдельное окно проверка ошибок вырезана для упрощения кода, при отладке все функции в EmbedBrowser возвращают S_OK Это сообщение отредактировал(а) GoldFinch - 24.12.2009, 10:02
|