From d4aacad9ea02ca3ff9ff204591197808123cf652 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 16 Nov 2011 19:12:40 +0100 Subject: [PATCH] mshtml: Added support for ActiveX objects without IQuickActivate support. --- dlls/mshtml/pluginhost.c | 44 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c index 8a1e6c0ece8..af0943b552c 100644 --- a/dlls/mshtml/pluginhost.c +++ b/dlls/mshtml/pluginhost.c @@ -186,6 +186,7 @@ static void activate_plugin(PluginHost *host) IClientSecurity *client_security; IQuickActivate *quick_activate; IOleCommandTarget *cmdtrg; + IViewObjectEx *view_obj; IOleObject *ole_obj; IDispatchEx *dispex; IDispatch *disp; @@ -211,22 +212,57 @@ static void activate_plugin(PluginHost *host) QACONTAINER container = {sizeof(container)}; QACONTROL control = {sizeof(control)}; + TRACE("Using IQuickActivate\n"); + container.pClientSite = &host->IOleClientSite_iface; container.dwAmbientFlags = QACONTAINER_SUPPORTSMNEMONICS|QACONTAINER_MESSAGEREFLECT|QACONTAINER_USERMODE; container.pAdviseSink = &host->IAdviseSinkEx_iface; container.pPropertyNotifySink = &host->IPropertyNotifySink_iface; hres = IQuickActivate_QuickActivate(quick_activate, &container, &control); + IQuickActivate_Release(quick_activate); if(FAILED(hres)) FIXME("QuickActivate failed: %08x\n", hres); + + load_plugin(host); }else { - FIXME("No IQuickActivate\n"); - return; + DWORD status = 0; + + hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IOleObject, (void**)&ole_obj); + if(FAILED(hres)) { + FIXME("Plugin does not support IOleObject\n"); + return; + } + + hres = IOleObject_GetMiscStatus(ole_obj, DVASPECT_CONTENT, &status); + TRACE("GetMiscStatus returned %08x %x\n", hres, status); + + hres = IOleObject_SetClientSite(ole_obj, &host->IOleClientSite_iface); + IOleObject_Release(ole_obj); + if(FAILED(hres)) { + FIXME("SetClientSite failed: %08x\n", hres); + return; + } + + load_plugin(host); + + hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IViewObjectEx, (void**)&view_obj); + if(SUCCEEDED(hres)) { + DWORD view_status = 0; + + hres = IViewObjectEx_SetAdvise(view_obj, DVASPECT_CONTENT, 0, (IAdviseSink*)&host->IAdviseSinkEx_iface); + if(FAILED(hres)) + WARN("SetAdvise failed: %08x\n", hres); + + hres = IViewObjectEx_GetViewStatus(view_obj, &view_status); + IViewObjectEx_Release(view_obj); + TRACE("GetViewStatus returned %08x %x\n", hres, view_status); + } } - load_plugin(host); + update_readystate(host); - /* NOTE: Native QIs for IViewObjectEx, IActiveScript, an undocumented IID, IOleControl and IRunnableObject */ + /* NOTE: Native QIs for IActiveScript, an undocumented IID, IOleControl and IRunnableObject */ hres = IUnknown_QueryInterface(host->plugin_unk, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) {