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