Misha Koshelev : msi: automation: Store parent Installer object in
Session.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon May 7 09:10:25 CDT 2007
Module: wine
Branch: master
Commit: 8ba0b3c7b9011f99f1d4ad0fa7b698d244fe367b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8ba0b3c7b9011f99f1d4ad0fa7b698d244fe367b
Author: Misha Koshelev <mk144210 at bcm.edu>
Date: Fri May 4 23:18:19 2007 -0500
msi: automation: Store parent Installer object in Session.
---
dlls/msi/automation.c | 13 ++++++++++---
dlls/msi/msipriv.h | 2 +-
dlls/msi/script.c | 11 ++++++++++-
3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/dlls/msi/automation.c b/dlls/msi/automation.c
index 65639a0..07994e1 100644
--- a/dlls/msi/automation.c
+++ b/dlls/msi/automation.c
@@ -61,6 +61,9 @@ interface AutomationObject {
/* The MSI handle of the current object */
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. */
HRESULT (STDMETHODCALLTYPE *funcInvoke)(
AutomationObject* This,
@@ -134,6 +137,7 @@ HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, LPVOI
object->msiHandle = msiHandle;
object->clsid = (LPCLSID)clsid;
object->funcInvoke = funcInvoke;
+ object->pInstaller = NULL;
/* Load our TypeInfo so we don't have to process GetIDsOfNames */
object->iTypeInfo = NULL;
@@ -894,7 +898,7 @@ static HRESULT WINAPI InstallerImpl_Invoke(
V_VT(pVarResult) = VT_DISPATCH;
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);
V_DISPATCH(pVarResult) = pDispatch;
@@ -922,7 +926,10 @@ HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj)
}
/* 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;
}
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index de08aeb..a8d833f 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -793,7 +793,7 @@ extern VOID ControlEvent_UnSubscribeToEvent( MSIPACKAGE *package, LPCWSTR event,
/* OLE automation */
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);
/* Scripting */
diff --git a/dlls/msi/script.c b/dlls/msi/script.c
index 018b198..54d0ee8 100644
--- a/dlls/msi/script.c
+++ b/dlls/msi/script.c
@@ -46,6 +46,7 @@ static const WCHAR szSession[] = {'S','e','s','s','i','o','n',0};
typedef struct {
IActiveScriptSite lpVtbl;
+ IDispatch *pInstaller;
IDispatch *pSession;
LONG ref;
} MsiActiveScriptSite;
@@ -65,6 +66,7 @@ static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj)
object->lpVtbl.lpVtbl = &ASS_Vtbl;
object->ref = 1;
+ object->pInstaller = NULL;
object->pSession = NULL;
*ppObj = object;
@@ -97,8 +99,13 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function
hr = create_ActiveScriptSite(NULL, (void **)&pActiveScriptSite);
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 */
- hr = create_session(hPackage, &pActiveScriptSite->pSession);
+ hr = create_session(hPackage, pActiveScriptSite->pInstaller, &pActiveScriptSite->pSession);
if (hr != S_OK) goto done;
IUnknown_AddRef((IUnknown *)pActiveScriptSite->pSession);
@@ -181,6 +188,8 @@ done:
if (pActiveScript) IActiveScriptSite_Release(pActiveScript);
if (pActiveScriptSite &&
pActiveScriptSite->pSession) IUnknown_Release((IUnknown *)pActiveScriptSite->pSession);
+ if (pActiveScriptSite &&
+ pActiveScriptSite->pInstaller) IUnknown_Release((IUnknown *)pActiveScriptSite->pInstaller);
if (pActiveScriptSite) IUnknown_Release((IUnknown *)pActiveScriptSite);
CoUninitialize(); /* must call even if CoInitialize failed */
More information about the wine-cvs
mailing list