[PATCH v4 04/11] msscript.ocx: Keep a ref to the script engine from a module.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Mon Jun 15 08:00:07 CDT 2020
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/msscript.ocx/msscript.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index 376af3c..74d33fc 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -51,6 +51,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msscript);
struct ScriptControl;
typedef struct ConnectionPoint ConnectionPoint;
+typedef struct ScriptHost ScriptHost;
struct ConnectionPoint {
IConnectionPoint IConnectionPoint_iface;
@@ -68,9 +69,11 @@ struct named_item {
typedef struct {
IScriptModule IScriptModule_iface;
LONG ref;
+
+ ScriptHost *host;
} ScriptModule;
-typedef struct ScriptHost {
+struct ScriptHost {
IActiveScriptSite IActiveScriptSite_iface;
IActiveScriptSiteWindow IActiveScriptSiteWindow_iface;
IServiceProvider IServiceProvider_iface;
@@ -83,7 +86,7 @@ typedef struct ScriptHost {
CLSID clsid;
struct list named_items;
-} ScriptHost;
+};
struct ScriptControl {
IScriptControl IScriptControl_iface;
@@ -608,7 +611,11 @@ static ULONG WINAPI ScriptModule_Release(IScriptModule *iface)
TRACE("(%p) ref=%d\n", This, ref);
if (!ref)
+ {
+ if (This->host)
+ IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
heap_free(This);
+ }
return ref;
}
@@ -762,6 +769,7 @@ static ScriptModule *create_module(void)
module->IScriptModule_iface.lpVtbl = &ScriptModuleVtbl;
module->ref = 1;
+ module->host = NULL;
return module;
}
@@ -1193,7 +1201,9 @@ static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR lan
{
ScriptControl *This = impl_from_IScriptControl(iface);
ScriptModule **modules;
+ unsigned int i;
CLSID clsid;
+ HRESULT hr;
TRACE("(%p)->(%s)\n", This, debugstr_w(language));
@@ -1214,6 +1224,12 @@ static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR lan
release_script_engine(This->host);
IActiveScriptSite_Release(&This->host->IActiveScriptSite_iface);
This->host = NULL;
+
+ for (i = 0; i < This->module_count; i++)
+ {
+ IActiveScriptSite_Release(&This->modules[i]->host->IActiveScriptSite_iface);
+ This->modules[i]->host = NULL;
+ }
}
release_modules(This);
@@ -1223,7 +1239,12 @@ static HRESULT WINAPI ScriptControl_put_Language(IScriptControl *iface, BSTR lan
if (!language)
return S_OK;
- return init_script_host(&clsid, &This->host);
+ hr = init_script_host(&clsid, &This->host);
+ if (FAILED(hr)) return hr;
+
+ modules[0]->host = This->host;
+ IActiveScriptSite_AddRef(&modules[0]->host->IActiveScriptSite_iface);
+ return S_OK;
}
static HRESULT WINAPI ScriptControl_get_State(IScriptControl *iface, ScriptControlStates *p)
--
2.21.0
More information about the wine-devel
mailing list