Module: wine Branch: master Commit: 821aae4f9f182b79532d4fe16974acef0aed4649 URL: http://source.winehq.org/git/wine.git/?a=commit;h=821aae4f9f182b79532d4fe169...
Author: Andrey Turkin pancha@mail.nnov.ru Date: Mon Oct 30 21:20:26 2006 +0300
atl: Implement AtlAxCreateControl and AtlAxCreateControlEx.
---
dlls/atl/Makefile.in | 2 +- dlls/atl/atl.spec | 2 +- dlls/atl/atl_ax.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++- dlls/atl/atl_main.c | 10 ---- dlls/atl/atlbase.h | 2 + dlls/atl/atliface.idl | 1 + 6 files changed, 130 insertions(+), 13 deletions(-)
diff --git a/dlls/atl/Makefile.in b/dlls/atl/Makefile.in index 24a8d88..4331990 100644 --- a/dlls/atl/Makefile.in +++ b/dlls/atl/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = atl.dll IMPORTLIB = libatl.$(IMPLIBEXT) -IMPORTS = ole32 shlwapi user32 gdi32 advapi32 kernel32 +IMPORTS = ole32 oleaut32 shlwapi user32 gdi32 advapi32 kernel32 EXTRALIBS = -luuid
C_SRCS = \ diff --git a/dlls/atl/atl.spec b/dlls/atl/atl.spec index a91cc84..db9ca9a 100644 --- a/dlls/atl/atl.spec +++ b/dlls/atl/atl.spec @@ -31,7 +31,7 @@ 37 stub AtlAxCreateDialogW 38 stub AtlAxCreateDialogA 39 stdcall AtlAxCreateControl(ptr ptr ptr ptr) -40 stub AtlAxCreateControlEx +40 stdcall AtlAxCreateControlEx(ptr ptr ptr ptr ptr ptr ptr) 41 stub AtlAxAttachControl 42 stdcall AtlAxWinInit() 43 stdcall AtlModuleAddCreateWndData(ptr ptr ptr) diff --git a/dlls/atl/atl_ax.c b/dlls/atl/atl_ax.c index 660e001..1170cb8 100644 --- a/dlls/atl/atl_ax.c +++ b/dlls/atl/atl_ax.c @@ -53,7 +53,7 @@ LRESULT static CALLBACK AtlAxWin_wndproc if (!ptr) return 1; GetWindowTextW( hWnd, ptr, len ); - AtlAxCreateControl( ptr, hWnd, NULL, NULL ); + AtlAxCreateControlEx( ptr, hWnd, NULL, NULL, NULL, NULL, NULL ); HeapFree( GetProcessHeap(), 0, ptr ); return 0; } @@ -97,3 +97,127 @@ BOOL WINAPI AtlAxWinInit(void)
return TRUE; } + +/*********************************************************************** + * AtlAxCreateControl [ATL.@] + */ +HRESULT WINAPI AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd, + IStream *pStream, IUnknown **ppUnkContainer) +{ + return AtlAxCreateControlEx( lpszName, hWnd, pStream, ppUnkContainer, + NULL, NULL, NULL ); +} + +/*********************************************************************** + * AtlAxCreateControlEx [ATL.@] + * + * REMARKS + * See http://www.codeproject.com/com/cwebpage.asp for some background + * + */ +HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, + IStream *pStream, IUnknown **ppUnkContainer, IUnknown **ppUnkControl, + REFIID iidSink, IUnknown *punkSink) +{ + CLSID controlId; + HRESULT hRes; + IOleObject *pControl; + IUnknown *pUnkControl; + IPersistStreamInit *pPSInit; + IUnknown *pContainer; + enum {IsGUID=0,IsHTML=1,IsURL=2} content; + + TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, + ppUnkContainer, ppUnkControl, iidSink, punkSink); + + hRes = CLSIDFromString( (LPOLESTR) lpszName, &controlId ); + if ( FAILED(hRes) ) + hRes = CLSIDFromProgID( lpszName, &controlId ); + if ( SUCCEEDED( hRes ) ) + content = IsGUID; + else { + /* FIXME - check for MSHTML: prefix! */ + content = IsURL; + memcpy( &controlId, &CLSID_WebBrowser, sizeof(controlId) ); + } + + hRes = CoCreateInstance( &controlId, 0, CLSCTX_ALL, &IID_IOleObject, + (void**) &pControl ); + if ( FAILED( hRes ) ) + { + WARN( "cannot create ActiveX control %s instance - error 0x%08x\n", + debugstr_guid( &controlId ), hRes ); + return hRes; + } + + hRes = IOleObject_QueryInterface( pControl, &IID_IPersistStreamInit, (void**) &pPSInit ); + if ( SUCCEEDED( hRes ) ) + { + if (!pStream) + IPersistStreamInit_InitNew( pPSInit ); + else + IPersistStreamInit_Load( pPSInit, pStream ); + IPersistStreamInit_Release( pPSInit ); + } else + WARN("cannot get IID_IPersistStreamInit out of control\n"); + + IOleObject_QueryInterface( pControl, &IID_IUnknown, (void**) &pUnkControl ); + IOleObject_Release( pControl ); + + + hRes = AtlAxAttachControl( pUnkControl, hWnd, &pContainer ); + if ( FAILED( hRes ) ) + WARN("cannot attach control to window\n"); + + if ( content == IsURL ) + { + IWebBrowser2 *browser; + + hRes = IOleObject_QueryInterface( pControl, &IID_IWebBrowser2, (void**) &browser ); + if ( !browser ) + WARN( "Cannot query IWebBrowser2 interface: %08x\n", hRes ); + else { + VARIANT url; + + IWebBrowser2_put_Visible( browser, VARIANT_TRUE ); /* it seems that native does this on URL (but do not on MSHTML:! why? */ + + V_VT(&url) = VT_BSTR; + V_BSTR(&url) = SysAllocString( lpszName ); + + hRes = IWebBrowser2_Navigate2( browser, &url, NULL, NULL, NULL, NULL ); + if ( FAILED( hRes ) ) + WARN( "IWebBrowser2::Navigate2 failed: %08x\n", hRes ); + SysFreeString( V_BSTR(&url) ); + + IWebBrowser2_Release( browser ); + } + } + + if (ppUnkContainer) + { + *ppUnkContainer = pContainer; + if ( pContainer ) + IUnknown_AddRef( pContainer ); + } + if (ppUnkControl) + { + *ppUnkControl = pUnkControl; + if ( pUnkControl ) + IUnknown_AddRef( pUnkControl ); + } + + IUnknown_Release( pUnkControl ); + if ( pContainer ) + IUnknown_Release( pContainer ); + + return S_OK; +} + +/*********************************************************************** + * AtlAxAttachControl [ATL.@] + */ +HRESULT WINAPI AtlAxAttachControl(IUnknown* pControl, HWND hWnd, IUnknown** ppUnkContainer) +{ + FIXME( "(%p %p %p) - stub\n", pControl, hWnd, ppUnkContainer ); + return E_NOTIMPL; +} diff --git a/dlls/atl/atl_main.c b/dlls/atl/atl_main.c index 0d2c67e..547a5cf 100644 --- a/dlls/atl/atl_main.c +++ b/dlls/atl/atl_main.c @@ -347,16 +347,6 @@ HRESULT WINAPI AtlModuleUnregisterServer }
/*********************************************************************** - * AtlAxCreateControl [ATL.@] - */ -HRESULT WINAPI AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd, - IStream *pStream, IUnknown **ppUnkContainer) -{ - FIXME("%s %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer); - return E_NOTIMPL; -} - -/*********************************************************************** * AtlModuleRegisterWndClassInfoW [ATL.@] * * PARAMS diff --git a/dlls/atl/atlbase.h b/dlls/atl/atlbase.h index 218db5e..c0a556f 100644 --- a/dlls/atl/atlbase.h +++ b/dlls/atl/atlbase.h @@ -142,7 +142,9 @@ struct _ATL_REGMAP_ENTRY };
HRESULT WINAPI AtlAdvise(IUnknown *pUnkCP, IUnknown *pUnk, const IID * iid, LPDWORD dpw); +HRESULT WINAPI AtlAxAttachControl(IUnknown*,HWND,IUnknown**); HRESULT WINAPI AtlAxCreateControl(LPCOLESTR,HWND,IStream*,IUnknown**); +HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR,HWND,IStream*,IUnknown**,IUnknown**,REFIID,IUnknown*); HRESULT WINAPI AtlFreeMarshalStream(IStream *pStream); HRESULT WINAPI AtlInternalQueryInterface(LPVOID pThis, const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, LPVOID* ppvObject); HRESULT WINAPI AtlMarshalPtrInProc(IUnknown *pUnk, const IID *iid, IStream **ppStream); diff --git a/dlls/atl/atliface.idl b/dlls/atl/atliface.idl index af01ee0..884d187 100644 --- a/dlls/atl/atliface.idl +++ b/dlls/atl/atliface.idl @@ -71,4 +71,5 @@ interface IRegistrar : IUnknown cpp_quote("DEFINE_GUID(CLSID_ATLRegistrar,0x44ec053a,0x400f,0x11d0,0x9d,0xcd,0x00,0xa0,0xc9,0x03,0x91,0xd3);")
cpp_quote("HRESULT WINAPI AtlAxCreateControl(LPCOLESTR,HWND,IStream*,IUnknown**);") +cpp_quote("HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR,HWND,IStream*,IUnknown**,IUnknown**,REFIID,IUnknown*);") cpp_quote("BOOL WINAPI AtlAxWinInit(void);")