wine/dlls/shell32 shelllink.c

Alexandre Julliard julliard at wine.codeweavers.com
Fri Nov 4 05:15:33 CST 2005


ChangeSet ID:	21108
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/04 05:15:33

Modified files:
	dlls/shell32   : shelllink.c 

Log message:
	Mike McCormack <mike at codeweavers.com>
	Use advapi32.CommandLineFromMsiDescriptor to get msi component paths.

Patch: http://cvs.winehq.org/patch.py?id=21108

Old revision  New revision  Changes     Path
 1.110         1.111         +14 -38     wine/dlls/shell32/shelllink.c

Index: wine/dlls/shell32/shelllink.c
diff -u -p wine/dlls/shell32/shelllink.c:1.110 wine/dlls/shell32/shelllink.c:1.111
--- wine/dlls/shell32/shelllink.c:1.110	4 Nov 2005 11:15:33 -0000
+++ wine/dlls/shell32/shelllink.c	4 Nov 2005 11:15:33 -0000
@@ -52,6 +52,7 @@
 #include "shlguid.h"
 #include "shlwapi.h"
 #include "msi.h"
+#include "appmgmt.h"
 
 #include "initguid.h"
 
@@ -2413,50 +2414,25 @@ ShellLink_QueryContextMenu( IContextMenu
     return MAKE_HRESULT( SEVERITY_SUCCESS, 0, id );
 }
 
-static LPWSTR shelllink_get_msi_component_path( LPCWSTR component )
+static LPWSTR
+shelllink_get_msi_component_path( LPWSTR component )
 {
-    UINT (WINAPI *pMsiDecomposeDescriptorW)(LPCWSTR,LPWSTR,LPWSTR,LPWSTR,DWORD*);
-    INSTALLSTATE (WINAPI *pMsiGetComponentPathW)(LPCWSTR,LPCWSTR,LPWSTR,DWORD*);
-    WCHAR szProd[MAX_FEATURE_CHARS+1], szFeat[MAX_FEATURE_CHARS+1],
-          szComp[MAX_FEATURE_CHARS+1], szCompPath[MAX_PATH];
-    INSTALLSTATE state;
     LPWSTR path = NULL;
-    HMODULE hmsi = NULL;
-    DWORD sz = 0;
-    UINT ret;
+    DWORD r, sz = 0;
 
-    TRACE("%s\n", debugstr_w( component ) );
-
-    hmsi = LoadLibraryA("msi");
-    if (!hmsi)
-        goto end;
-
-    pMsiDecomposeDescriptorW = (LPVOID) GetProcAddress(hmsi, "MsiDecomposeDescriptorW");
-    pMsiGetComponentPathW = (LPVOID) GetProcAddress(hmsi, "MsiGetComponentPathW");
-    if (!pMsiDecomposeDescriptorW || !pMsiGetComponentPathW)
-        goto end;
-
-    ret = pMsiDecomposeDescriptorW( component, szProd, szFeat, szComp, &sz );
-    if (ret != ERROR_SUCCESS)
+    r = CommandLineFromMsiDescriptor( component, NULL, &sz );
+    if (r != ERROR_SUCCESS)
+         return path;
+
+    sz++;
+    path = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) );
+    r = CommandLineFromMsiDescriptor( component, path, &sz );
+    if (r != ERROR_SUCCESS)
     {
-        ERR("failed to decompose descriptor %s\n", debugstr_w( component ) );
-        goto end;
+        HeapFree( GetProcessHeap(), 0, path );
+        path = NULL;
     }
 
-    sz = MAX_PATH;
-    state = pMsiGetComponentPathW( szProd, szComp, szCompPath, &sz );
-    if (state != INSTALLSTATE_LOCAL)
-    {
-        ERR("MsiGetComponentPathW failed with error %d\n", ret );
-        goto end;
-    }
-
-    path = strdupW( szCompPath );
-
-end:
-    if (hmsi)
-        FreeLibrary( hmsi );
-
     TRACE("returning %s\n", debugstr_w( path ) );
 
     return path;



More information about the wine-cvs mailing list