Hans Leidekker : msi: Use the right interface to call 32-bit and 64-bit custom action scripts.

Alexandre Julliard julliard at winehq.org
Fri Jul 27 13:13:56 CDT 2012


Module: wine
Branch: master
Commit: 108d5927d005c0dec95f78bee3c5d7cbe0b94708
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=108d5927d005c0dec95f78bee3c5d7cbe0b94708

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Jul 27 14:02:22 2012 +0200

msi: Use the right interface to call 32-bit and 64-bit custom action scripts.

---

 dlls/msi/script.c |   67 ++++++++++++++++++++++++++++++++--------------------
 1 files changed, 41 insertions(+), 26 deletions(-)

diff --git a/dlls/msi/script.c b/dlls/msi/script.c
index 236b60b..4866630 100644
--- a/dlls/msi/script.c
+++ b/dlls/msi/script.c
@@ -81,7 +81,8 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function
 {
     HRESULT hr;
     IActiveScript *pActiveScript = NULL;
-    IActiveScriptParse *pActiveScriptParse = NULL;
+    IActiveScriptParse32 *pActiveScriptParse32 = NULL;
+    IActiveScriptParse64 *pActiveScriptParse64 = NULL;
     MsiActiveScriptSite *pActiveScriptSite = NULL;
     IDispatch *pDispatch = NULL;
     DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
@@ -123,27 +124,41 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function
         goto done;
     }
 
-    /* Get the IActiveScriptParse engine interface */
-    hr = IActiveScript_QueryInterface(pActiveScript, &IID_IActiveScriptParse, (void **)&pActiveScriptParse);
-    if (FAILED(hr)) goto done;
+    if (type & msidbCustomActionType64BitScript)
+    {
+        hr = IActiveScript_QueryInterface(pActiveScript, &IID_IActiveScriptParse64, (void **)&pActiveScriptParse64);
+        if (FAILED(hr)) goto done;
 
-    /* Give our host to the engine */
-    hr = IActiveScript_SetScriptSite(pActiveScript, (IActiveScriptSite *)pActiveScriptSite);
-    if (FAILED(hr)) goto done;
+        hr = IActiveScript_SetScriptSite(pActiveScript, (IActiveScriptSite *)pActiveScriptSite);
+        if (FAILED(hr)) goto done;
 
-    /* Initialize the script engine */
-    hr = IActiveScriptParse64_InitNew(pActiveScriptParse);
-    if (FAILED(hr)) goto done;
+        hr = IActiveScriptParse64_InitNew(pActiveScriptParse64);
+        if (FAILED(hr)) goto done;
 
-    /* Add the session object */
-    hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_GLOBALMEMBERS);
-    if (FAILED(hr)) goto done;
+        hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_GLOBALMEMBERS);
+        if (FAILED(hr)) goto done;
 
-    /* Pass the script to the engine */
-    hr = IActiveScriptParse64_ParseScriptText(pActiveScriptParse, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL);
-    if (FAILED(hr)) goto done;
+        hr = IActiveScriptParse64_ParseScriptText(pActiveScriptParse64, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL);
+        if (FAILED(hr)) goto done;
+    }
+    else
+    {
+        hr = IActiveScript_QueryInterface(pActiveScript, &IID_IActiveScriptParse32, (void **)&pActiveScriptParse32);
+        if (FAILED(hr)) goto done;
+
+        hr = IActiveScript_SetScriptSite(pActiveScript, (IActiveScriptSite *)pActiveScriptSite);
+        if (FAILED(hr)) goto done;
+
+        hr = IActiveScriptParse32_InitNew(pActiveScriptParse32);
+        if (FAILED(hr)) goto done;
+
+        hr = IActiveScript_AddNamedItem(pActiveScript, szSession, SCRIPTITEM_GLOBALMEMBERS);
+        if (FAILED(hr)) goto done;
+
+        hr = IActiveScriptParse32_ParseScriptText(pActiveScriptParse32, script, NULL, NULL, NULL, 0, 0, 0L, NULL, NULL);
+        if (FAILED(hr)) goto done;
+    }
 
-    /* Start processing the script */
     hr = IActiveScript_SetScriptState(pActiveScript, SCRIPTSTATE_CONNECTED);
     if (FAILED(hr)) goto done;
 
@@ -176,17 +191,17 @@ DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function
 
 done:
 
-    /* Free everything that needs to be freed */
     if (pDispatch) IDispatch_Release(pDispatch);
-    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);
-
+    if (pActiveScript) IActiveScript_Release(pActiveScript);
+    if (pActiveScriptParse32) IActiveScriptParse32_Release(pActiveScriptParse32);
+    if (pActiveScriptParse64) IActiveScriptParse64_Release(pActiveScriptParse64);
+    if (pActiveScriptSite)
+    {
+        if (pActiveScriptSite->pSession) IDispatch_Release(pActiveScriptSite->pSession);
+        if (pActiveScriptSite->pInstaller) IDispatch_Release(pActiveScriptSite->pInstaller);
+        IActiveScriptSite_Release((IActiveScriptSite *)pActiveScriptSite);
+    }
     CoUninitialize();    /* must call even if CoInitialize failed */
-
     return ret;
 }
 




More information about the wine-cvs mailing list