Hans Leidekker : msi: Pass REINSTALL and REINSTALLMODE properties on the command line in MsiReinstallFeatureW .

Alexandre Julliard julliard at winehq.org
Tue Dec 13 13:01:28 CST 2011


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Dec 13 13:19:49 2011 +0100

msi: Pass REINSTALL and REINSTALLMODE properties on the command line in MsiReinstallFeatureW.

---

 dlls/msi/msi.c |   24 ++++++++++++++----------
 1 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 09b2d36..bdcb17a 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -3770,14 +3770,14 @@ UINT WINAPI MsiGetShortcutTargetW( LPCWSTR szShortcutTarget,
     return ERROR_FUNCTION_FAILED;
 }
 
-UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature,
-                                  DWORD dwReinstallMode )
+UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, DWORD dwReinstallMode )
 {
+    static const WCHAR fmtW[] = {'%','s','=','%','s',' ','%','s','=','%','s',0};
     MSIPACKAGE *package;
     MSIINSTALLCONTEXT context;
     UINT r;
     WCHAR sourcepath[MAX_PATH], filename[MAX_PATH], reinstallmode[11];
-    LPWSTR ptr;
+    WCHAR *ptr, *cmdline;
     DWORD sz;
 
     TRACE("%s, %s, 0x%08x\n", debugstr_w(szProduct), debugstr_w(szFeature), dwReinstallMode);
@@ -3813,12 +3813,10 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature,
     sz = sizeof(sourcepath);
     MsiSourceListGetInfoW( szProduct, NULL, context, MSICODE_PRODUCT,
                            INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz );
-
     sz = sizeof(filename);
     MsiSourceListGetInfoW( szProduct, NULL, context, MSICODE_PRODUCT,
                            INSTALLPROPERTY_PACKAGENAMEW, filename, &sz );
-
-    lstrcatW( sourcepath, filename );
+    strcatW( sourcepath, filename );
 
     if (dwReinstallMode & REINSTALLMODE_PACKAGE)
         r = MSI_OpenPackageW( sourcepath, &package );
@@ -3828,12 +3826,18 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature,
     if (r != ERROR_SUCCESS)
         return r;
 
-    msi_set_property( package->db, szReinstallMode, reinstallmode );
-    msi_set_property( package->db, szReinstall, szFeature );
-
-    r = MSI_InstallPackage( package, sourcepath, NULL );
+    sz = (strlenW( fmtW ) + strlenW( szReinstallMode ) + strlenW( reinstallmode )) * sizeof(WCHAR);
+    sz += (strlenW( szReinstall ) + strlenW( szFeature )) * sizeof(WCHAR);
+    if (!(cmdline = msi_alloc( sz )))
+    {
+        msiobj_release( &package->hdr );
+        return ERROR_OUTOFMEMORY;
+    }
+    sprintfW( cmdline, fmtW, szReinstallMode, reinstallmode, szReinstall, szFeature );
 
+    r = MSI_InstallPackage( package, sourcepath, cmdline );
     msiobj_release( &package->hdr );
+    msi_free( cmdline );
 
     return r;
 }




More information about the wine-cvs mailing list