msi: Properly locate the published product in MsiConfigureProductEx.
This commit is contained in:
parent
ac976c94c8
commit
9518d7f8c7
|
@ -45,6 +45,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi);
|
||||||
|
|
||||||
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
|
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
|
||||||
|
|
||||||
|
/* FIXME: user-managed installs not located */
|
||||||
|
static UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context)
|
||||||
|
{
|
||||||
|
HKEY hkey = NULL;
|
||||||
|
UINT r;
|
||||||
|
|
||||||
|
*context = MSIINSTALLCONTEXT_NONE;
|
||||||
|
|
||||||
|
r = MSIREG_OpenLocalClassesProductKey(szProduct, &hkey, FALSE);
|
||||||
|
if (r == ERROR_SUCCESS)
|
||||||
|
*context = MSIINSTALLCONTEXT_MACHINE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
r = MSIREG_OpenUserProductsKey(szProduct, &hkey, FALSE);
|
||||||
|
if (r == ERROR_SUCCESS)
|
||||||
|
*context = MSIINSTALLCONTEXT_USERUNMANAGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
|
UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
|
||||||
{
|
{
|
||||||
UINT r;
|
UINT r;
|
||||||
|
@ -346,6 +368,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
|
||||||
INSTALLSTATE eInstallState, LPCWSTR szCommandLine)
|
INSTALLSTATE eInstallState, LPCWSTR szCommandLine)
|
||||||
{
|
{
|
||||||
MSIPACKAGE* package = NULL;
|
MSIPACKAGE* package = NULL;
|
||||||
|
MSIINSTALLCONTEXT context;
|
||||||
UINT r;
|
UINT r;
|
||||||
DWORD sz;
|
DWORD sz;
|
||||||
WCHAR sourcepath[MAX_PATH];
|
WCHAR sourcepath[MAX_PATH];
|
||||||
|
@ -367,25 +390,23 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
|
||||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r = msi_locate_product(szProduct, &context);
|
||||||
|
if (r != ERROR_SUCCESS)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
if (context == MSIINSTALLCONTEXT_NONE)
|
||||||
|
return ERROR_UNKNOWN_PRODUCT;
|
||||||
|
|
||||||
sz = sizeof(sourcepath);
|
sz = sizeof(sourcepath);
|
||||||
MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
|
MsiSourceListGetInfoW(szProduct, NULL, context, MSICODE_PRODUCT,
|
||||||
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath,
|
INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz);
|
||||||
&sz);
|
|
||||||
|
|
||||||
sz = sizeof(filename);
|
sz = sizeof(filename);
|
||||||
MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED,
|
MsiSourceListGetInfoW(szProduct, NULL, context, MSICODE_PRODUCT,
|
||||||
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
|
INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
|
||||||
|
|
||||||
lstrcatW(sourcepath,filename);
|
lstrcatW(sourcepath, filename);
|
||||||
|
r = MSI_OpenPackageW(sourcepath, &package);
|
||||||
/*
|
|
||||||
* ok 1, we need to find the msi file for this product.
|
|
||||||
* 2, find the source dir for the files
|
|
||||||
* 3, do the configure/install.
|
|
||||||
* 4, cleanupany runonce entry.
|
|
||||||
*/
|
|
||||||
|
|
||||||
r = MSI_OpenProductW( szProduct, &package );
|
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
@ -395,7 +416,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
|
||||||
sz += lstrlenW(szCommandLine);
|
sz += lstrlenW(szCommandLine);
|
||||||
|
|
||||||
commandline = msi_alloc(sz * sizeof(WCHAR));
|
commandline = msi_alloc(sz * sizeof(WCHAR));
|
||||||
if (!commandline )
|
if (!commandline)
|
||||||
{
|
{
|
||||||
r = ERROR_OUTOFMEMORY;
|
r = ERROR_OUTOFMEMORY;
|
||||||
goto end;
|
goto end;
|
||||||
|
|
Loading…
Reference in New Issue