Commit 8ba0b3c7 authored by Misha Koshelev's avatar Misha Koshelev Committed by Alexandre Julliard

msi: automation: Store parent Installer object in Session.

parent 4a5a90b0
...@@ -61,6 +61,9 @@ interface AutomationObject { ...@@ -61,6 +61,9 @@ interface AutomationObject {
/* The MSI handle of the current object */ /* The MSI handle of the current object */
MSIHANDLE msiHandle; MSIHANDLE msiHandle;
/* The parent Installer object (only used in the Session object) */
IDispatch *pInstaller;
/* A function that is called from AutomationObject::Invoke, specific to this type of object. */ /* A function that is called from AutomationObject::Invoke, specific to this type of object. */
HRESULT (STDMETHODCALLTYPE *funcInvoke)( HRESULT (STDMETHODCALLTYPE *funcInvoke)(
AutomationObject* This, AutomationObject* This,
...@@ -134,6 +137,7 @@ HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, LPVOI ...@@ -134,6 +137,7 @@ HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, LPVOI
object->msiHandle = msiHandle; object->msiHandle = msiHandle;
object->clsid = (LPCLSID)clsid; object->clsid = (LPCLSID)clsid;
object->funcInvoke = funcInvoke; object->funcInvoke = funcInvoke;
object->pInstaller = NULL;
/* Load our TypeInfo so we don't have to process GetIDsOfNames */ /* Load our TypeInfo so we don't have to process GetIDsOfNames */
object->iTypeInfo = NULL; object->iTypeInfo = NULL;
...@@ -894,7 +898,7 @@ static HRESULT WINAPI InstallerImpl_Invoke( ...@@ -894,7 +898,7 @@ static HRESULT WINAPI InstallerImpl_Invoke(
V_VT(pVarResult) = VT_DISPATCH; V_VT(pVarResult) = VT_DISPATCH;
if ((ret = MsiOpenPackageExW(V_BSTR(&varg0), V_I4(&varg1), &msiHandle)) == ERROR_SUCCESS) if ((ret = MsiOpenPackageExW(V_BSTR(&varg0), V_I4(&varg1), &msiHandle)) == ERROR_SUCCESS)
{ {
if (SUCCEEDED(create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Session, SessionImpl_Invoke))) if (SUCCEEDED(create_session(msiHandle, (IDispatch *)This, &pDispatch)))
{ {
IDispatch_AddRef(pDispatch); IDispatch_AddRef(pDispatch);
V_DISPATCH(pVarResult) = pDispatch; V_DISPATCH(pVarResult) = pDispatch;
...@@ -922,7 +926,10 @@ HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj) ...@@ -922,7 +926,10 @@ HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj)
} }
/* Wrapper around create_automation_object to create a session object. */ /* Wrapper around create_automation_object to create a session object. */
HRESULT create_session(MSIHANDLE msiHandle, IDispatch **pDispatch) HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch)
{ {
return create_automation_object(msiHandle, NULL, (LPVOID)pDispatch, &DIID_Session, SessionImpl_Invoke); HRESULT hr = create_automation_object(msiHandle, NULL, (LPVOID)pDispatch, &DIID_Session, SessionImpl_Invoke);
if (SUCCEEDED(hr) && pDispatch && *pDispatch)
((AutomationObject *)*pDispatch)->pInstaller = (IDispatch *)pInstaller;
return hr;
} }
...@@ -793,7 +793,7 @@ extern VOID ControlEvent_UnSubscribeToEvent( MSIPACKAGE *package, LPCWSTR event, ...@@ -793,7 +793,7 @@ extern VOID ControlEvent_UnSubscribeToEvent( MSIPACKAGE *package, LPCWSTR event,
/* OLE automation */ /* OLE automation */
extern HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj); extern HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj);
extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch **pDispatch); extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch);
extern HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid); extern HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid);
/* Scripting */ /* Scripting */
......
...@@ -46,6 +46,7 @@ static const WCHAR szSession[] = {'S','e','s','s','i','o','n',0}; ...@@ -46,6 +46,7 @@ static const WCHAR szSession[] = {'S','e','s','s','i','o','n',0};
typedef struct { typedef struct {
IActiveScriptSite lpVtbl; IActiveScriptSite lpVtbl;
IDispatch *pInstaller;
IDispatch *pSession; IDispatch *pSession;
LONG ref; LONG ref;
} MsiActiveScriptSite; } MsiActiveScriptSite;
...@@ -65,6 +66,7 @@ static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj) ...@@ -65,6 +66,7 @@ static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj)
object->lpVtbl.lpVtbl = &ASS_Vtbl; object->lpVtbl.lpVtbl = &ASS_Vtbl;
object->ref = 1; object->ref = 1;
object->pInstaller = NULL;
object->pSession = NULL; object->pSession = NULL;
*ppObj = object; *ppObj = object;
...@@ -97,8 +99,13 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function ...@@ -97,8 +99,13 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function
hr = create_ActiveScriptSite(NULL, (void **)&pActiveScriptSite); hr = create_ActiveScriptSite(NULL, (void **)&pActiveScriptSite);
if (hr != S_OK) goto done; if (hr != S_OK) goto done;
/* Create an installer object */
hr = create_msiserver(NULL, (LPVOID *)&pActiveScriptSite->pInstaller);
if (hr != S_OK) goto done;
IUnknown_AddRef((IUnknown *)pActiveScriptSite->pInstaller);
/* Create a session object */ /* Create a session object */
hr = create_session(hPackage, &pActiveScriptSite->pSession); hr = create_session(hPackage, pActiveScriptSite->pInstaller, &pActiveScriptSite->pSession);
if (hr != S_OK) goto done; if (hr != S_OK) goto done;
IUnknown_AddRef((IUnknown *)pActiveScriptSite->pSession); IUnknown_AddRef((IUnknown *)pActiveScriptSite->pSession);
...@@ -181,6 +188,8 @@ done: ...@@ -181,6 +188,8 @@ done:
if (pActiveScript) IActiveScriptSite_Release(pActiveScript); if (pActiveScript) IActiveScriptSite_Release(pActiveScript);
if (pActiveScriptSite && if (pActiveScriptSite &&
pActiveScriptSite->pSession) IUnknown_Release((IUnknown *)pActiveScriptSite->pSession); pActiveScriptSite->pSession) IUnknown_Release((IUnknown *)pActiveScriptSite->pSession);
if (pActiveScriptSite &&
pActiveScriptSite->pInstaller) IUnknown_Release((IUnknown *)pActiveScriptSite->pInstaller);
if (pActiveScriptSite) IUnknown_Release((IUnknown *)pActiveScriptSite); if (pActiveScriptSite) IUnknown_Release((IUnknown *)pActiveScriptSite);
CoUninitialize(); /* must call even if CoInitialize failed */ CoUninitialize(); /* must call even if CoInitialize failed */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment