[PATCH v6 04/12] msscript.ocx: Always detach the modules when changing the language.

Gabriel Ivăncescu gabrielopcode at gmail.com
Wed Jun 24 09:16:49 CDT 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---

This is needed since put_Language not only calls Close but also the detached
modules return E_FAIL since they are orphaned.

 dlls/msscript.ocx/msscript.c | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index df63220..90524a5 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -575,6 +575,17 @@ static void detach_script_host(ScriptHost *host)
     host->script = NULL;
 }
 
+static void detach_module(ScriptModule *module)
+{
+    ScriptHost *host = module->host;
+
+    if (host) {
+        module->host = NULL;
+        detach_script_host(host);
+        IActiveScriptSite_Release(&host->IActiveScriptSite_iface);
+    }
+}
+
 static HRESULT WINAPI ScriptModule_QueryInterface(IScriptModule *iface, REFIID riid, void **ppv)
 {
     ScriptModule *This = impl_from_IScriptModule(iface);
@@ -614,8 +625,7 @@ static ULONG WINAPI ScriptModule_Release(IScriptModule *iface)
 
     if (!ref)
     {
-        detach_script_host(This->host);
-        IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
+        detach_module(This);
         heap_free(This);
     }
 
@@ -776,12 +786,14 @@ static ScriptModule *create_module(ScriptHost *host)
     return module;
 }
 
-static void release_modules(ScriptControl *control)
+static void release_modules(ScriptControl *control, BOOL force_detach)
 {
-    unsigned int i;
+    unsigned int i, module_count = control->host->module_count;
 
-    for (i = 0; i < control->host->module_count; i++)
+    for (i = 0; i < module_count; i++) {
+        if (force_detach) detach_module(control->modules[i]);
         IScriptModule_Release(&control->modules[i]->IScriptModule_iface);
+    }
 
     heap_free(control->modules);
 }
@@ -1080,7 +1092,7 @@ static ULONG WINAPI ScriptControl_Release(IScriptControl *iface)
             IOleClientSite_Release(This->site);
         if (This->host)
         {
-            release_modules(This);
+            release_modules(This, FALSE);
             IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
         }
         heap_free(This);
@@ -1181,7 +1193,7 @@ static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR lan
         return CTL_E_INVALIDPROPERTYVALUE;
 
     if (This->host) {
-        release_modules(This);
+        release_modules(This, TRUE);
         IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
         This->host = NULL;
     }
-- 
2.21.0




More information about the wine-devel mailing list