ChangeSet ID: 21108 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/04 05:15:33
Modified files: dlls/shell32 : shelllink.c
Log message: Mike McCormack mike@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;