Commit 85b3f37d authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Use advapi32.CommandLineFromMsiDescriptor to get msi component paths.

parent febe90b2
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "shlguid.h" #include "shlguid.h"
#include "shlwapi.h" #include "shlwapi.h"
#include "msi.h" #include "msi.h"
#include "appmgmt.h"
#include "initguid.h" #include "initguid.h"
...@@ -2413,50 +2414,25 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, ...@@ -2413,50 +2414,25 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu,
return MAKE_HRESULT( SEVERITY_SUCCESS, 0, id ); 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; LPWSTR path = NULL;
HMODULE hmsi = NULL; DWORD r, sz = 0;
DWORD sz = 0;
UINT ret;
TRACE("%s\n", debugstr_w( component ) ); r = CommandLineFromMsiDescriptor( component, NULL, &sz );
if (r != ERROR_SUCCESS)
hmsi = LoadLibraryA("msi"); return path;
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)
{
ERR("failed to decompose descriptor %s\n", debugstr_w( component ) );
goto end;
}
sz = MAX_PATH; sz++;
state = pMsiGetComponentPathW( szProd, szComp, szCompPath, &sz ); path = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) );
if (state != INSTALLSTATE_LOCAL) r = CommandLineFromMsiDescriptor( component, path, &sz );
if (r != ERROR_SUCCESS)
{ {
ERR("MsiGetComponentPathW failed with error %d\n", ret ); HeapFree( GetProcessHeap(), 0, path );
goto end; path = NULL;
} }
path = strdupW( szCompPath );
end:
if (hmsi)
FreeLibrary( hmsi );
TRACE("returning %s\n", debugstr_w( path ) ); TRACE("returning %s\n", debugstr_w( path ) );
return path; return path;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment