From: Qian Hong Subject: [PATCH 2/2] atl100: Implemented semi stub AtlAxCreateControlLic and AtlAxCreateControlLicEx. Message-Id: <54C238F5.8010008@codeweavers.com> Date: Fri, 23 Jan 2015 20:05:09 +0800 Try 2: - Superseded patch 108783. - Forwarding AtlAxCreateControlEx to AtlAxCreateControlLicEx, forwarding AtlAxCreateControlLic to AtlAxCreateControlLicEx. (Thanks Jacek) - A few spaces tweak. --- dlls/atl/atl_ax.c | 206 +++++++++++++++++++++++++++--------------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/dlls/atl/atl_ax.c b/dlls/atl/atl_ax.c index 15b0550..9116650 100644 --- a/dlls/atl/atl_ax.c +++ b/dlls/atl/atl_ax.c @@ -1036,110 +1036,16 @@ static enum content get_content_type(LPCOLESTR name, CLSID *control_id) /*********************************************************************** * AtlAxCreateControlEx [atl100.@] - * - * 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 = NULL; - IPersistStreamInit *pPSInit; - IUnknown *pContainer = NULL; - enum content content; - - TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, - ppUnkContainer, ppUnkControl, iidSink, punkSink); - - if (ppUnkContainer) *ppUnkContainer = NULL; - if (ppUnkControl) *ppUnkControl = NULL; - - content = get_content_type(lpszName, &controlId); - - if (content == IsEmpty) - return S_OK; - - if (content == IsUnknown) - return CO_E_CLASSSTRING; - - 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 ); - } - - if ( pUnkControl ) - IUnknown_Release( pUnkControl ); - if ( pContainer ) - IUnknown_Release( pContainer ); - - return S_OK; + return AtlAxCreateControlLicEx( lpszName, hWnd, pStream, ppUnkContainer, + ppUnkControl, iidSink, punkSink, NULL ); } + /*********************************************************************** * AtlAxAttachControl [atl100.@] */ @@ -1435,20 +1341,114 @@ INT_PTR WINAPI AtlAxDialogBoxA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND */ HRESULT WINAPI AtlAxCreateControlLic(const WCHAR *lpTricsData, HWND hwnd, IStream *stream, IUnknown **container, BSTR lic) { - FIXME("(%s %p %p %p %s)\n", debugstr_w(lpTricsData), hwnd, stream, container, debugstr_w(lic)); - return E_NOTIMPL; + return AtlAxCreateControlLicEx( lpTricsData, hwnd, stream, container, NULL, NULL, NULL, lic ); } /*********************************************************************** * AtlAxCreateControlLicEx [atl100.60] * + * REMARKS + * See http://www.codeproject.com/com/cwebpage.asp for some background + * */ HRESULT WINAPI AtlAxCreateControlLicEx(const WCHAR *lpTricsData, HWND hwnd, IStream *stream, - IUnknown **container, IUnknown **control, REFIID iidSink, IUnknown *punkSink, BSTR lic) + IUnknown **ppUnkContainer, IUnknown **ppUnkControl, REFIID iidSink, IUnknown *punkSink, BSTR lic) { - FIXME("(%s %p %p %p %p %s %p %s)\n", debugstr_w(lpTricsData), hwnd, stream, container, control, - debugstr_guid(iidSink), punkSink, debugstr_w(lic)); - return E_NOTIMPL; + CLSID controlId; + HRESULT hRes; + IOleObject *pControl; + IUnknown *pUnkControl = NULL; + IPersistStreamInit *pPSInit; + IUnknown *pContainer = NULL; + enum content content; + + TRACE( "(%s %p %p %p %p %p %p)\n", debugstr_w( lpTricsData ), hwnd, stream, + ppUnkContainer, ppUnkControl, iidSink, punkSink ); + + if ( lic ) + FIXME( "semi stub lic %s\n", debugstr_w( lic ) ); + + if ( ppUnkContainer ) *ppUnkContainer = NULL; + if ( ppUnkControl ) *ppUnkControl = NULL; + + content = get_content_type( lpTricsData, &controlId ); + + if ( content == IsEmpty ) + return S_OK; + + if ( content == IsUnknown ) + return CO_E_CLASSSTRING; + + 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 ( !stream ) + IPersistStreamInit_InitNew( pPSInit ); + else + IPersistStreamInit_Load( pPSInit, stream ); + 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( lpTricsData ); + + 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 ); + } + + if ( pUnkControl ) + IUnknown_Release( pUnkControl ); + if ( pContainer ) + IUnknown_Release( pContainer ); + + return S_OK; } #endif