Use advapi32.CommandLineFromMsiDescriptor to get msi component paths.

This commit is contained in:
Mike McCormack 2005-11-04 11:15:33 +00:00 committed by Alexandre Julliard
parent febe90b263
commit 85b3f37d31
1 changed files with 13 additions and 37 deletions

View File

@ -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* iface, HMENU hmenu, UINT indexMenu,
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 ) );
r = CommandLineFromMsiDescriptor( component, NULL, &sz );
if (r != ERROR_SUCCESS)
return path;
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)
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;