[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