[5/6] msi: Pass REINSTALL and REINSTALLMODE properties on the command line in MsiReinstallFeatureW.

Hans Leidekker hans at codeweavers.com
Tue Dec 13 06:19:49 CST 2011


---
 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;
 }
-- 
1.7.7.3







More information about the wine-patches mailing list