mirror of
https://github.com/reactos/wine.git
synced 2024-12-02 00:36:43 +00:00
Register the FileType and correct short vs long path problems with
InprocServer32. Also add install_on_demand boolean for future expansion.
This commit is contained in:
parent
1ab7234d55
commit
44816cebd6
@ -5288,7 +5288,10 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
static const WCHAR szVIProgID[] = { 'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0 };
|
static const WCHAR szVIProgID[] = { 'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0 };
|
||||||
static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
|
static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
|
||||||
static const WCHAR szSpace[] = {' ',0};
|
static const WCHAR szSpace[] = {' ',0};
|
||||||
|
static const WCHAR szInprocServer32[] = {'I','n','p','r','o','c','S','e','r','v','e','r','3','2',0};
|
||||||
|
static const WCHAR szFileType_fmt[] = {'F','i','l','e','T','y','p','e','\\','%','s','\\','%','i',0};
|
||||||
HKEY hkey,hkey2,hkey3;
|
HKEY hkey,hkey2,hkey3;
|
||||||
|
BOOL install_on_demand = FALSE;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!package)
|
if (!package)
|
||||||
@ -5299,6 +5302,11 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
|
/* install_on_demand should be set if OLE supports install on demand OLE
|
||||||
|
* servers. For now i am defaulting to FALSE because i do not know how to
|
||||||
|
* check, and i am told our builtin OLE does not support it
|
||||||
|
*/
|
||||||
|
|
||||||
for (i = 0; i < package->loaded_classes; i++)
|
for (i = 0; i < package->loaded_classes; i++)
|
||||||
{
|
{
|
||||||
INT index,f_index;
|
INT index,f_index;
|
||||||
@ -5319,8 +5327,8 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
*/
|
*/
|
||||||
if ((!ACTION_VerifyFeatureForAction(package, f_index,
|
if ((!ACTION_VerifyFeatureForAction(package, f_index,
|
||||||
INSTALLSTATE_LOCAL)) &&
|
INSTALLSTATE_LOCAL)) &&
|
||||||
(!ACTION_VerifyFeatureForAction(package, f_index,
|
!(install_on_demand && ACTION_VerifyFeatureForAction(package,
|
||||||
INSTALLSTATE_ADVERTISED)))
|
f_index, INSTALLSTATE_ADVERTISED)))
|
||||||
{
|
{
|
||||||
TRACE("Skipping class %s reg due to disabled feature %s\n",
|
TRACE("Skipping class %s reg due to disabled feature %s\n",
|
||||||
debugstr_w(package->classes[i].CLSID),
|
debugstr_w(package->classes[i].CLSID),
|
||||||
@ -5347,16 +5355,43 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
index = get_loaded_file(package,package->components[index].KeyPath);
|
index = get_loaded_file(package,package->components[index].KeyPath);
|
||||||
|
|
||||||
|
|
||||||
/* the context server is a short path name */
|
/* the context server is a short path name
|
||||||
sz = 0;
|
* except for if it is InprocServer32...
|
||||||
sz = GetShortPathNameW(package->files[index].TargetPath, NULL, 0);
|
*/
|
||||||
if (sz == 0)
|
if (strcmpiW(package->classes[i].Context,szInprocServer32)!=0)
|
||||||
{
|
{
|
||||||
ERR("Unable to find short path for CLSID COM Server\n");
|
sz = 0;
|
||||||
|
sz = GetShortPathNameW(package->files[index].TargetPath, NULL, 0);
|
||||||
|
if (sz == 0)
|
||||||
|
{
|
||||||
|
ERR("Unable to find short path for CLSID COM Server\n");
|
||||||
|
argument = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size = sz * sizeof(WCHAR);
|
||||||
|
|
||||||
|
if (package->classes[i].Argument)
|
||||||
|
{
|
||||||
|
size += strlenW(package->classes[i].Argument) *
|
||||||
|
sizeof(WCHAR);
|
||||||
|
size += sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
|
||||||
|
argument = HeapAlloc(GetProcessHeap(), 0, size + sizeof(WCHAR));
|
||||||
|
GetShortPathNameW(package->files[index].TargetPath, argument,
|
||||||
|
sz);
|
||||||
|
|
||||||
|
if (package->classes[i].Argument)
|
||||||
|
{
|
||||||
|
strcatW(argument,szSpace);
|
||||||
|
strcatW(argument,package->classes[i].Argument);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size = sz * sizeof(WCHAR);
|
size = lstrlenW(package->files[index].TargetPath) * sizeof(WCHAR);
|
||||||
|
|
||||||
if (package->classes[i].Argument)
|
if (package->classes[i].Argument)
|
||||||
{
|
{
|
||||||
@ -5365,14 +5400,17 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
}
|
}
|
||||||
|
|
||||||
argument = HeapAlloc(GetProcessHeap(), 0, size + sizeof(WCHAR));
|
argument = HeapAlloc(GetProcessHeap(), 0, size + sizeof(WCHAR));
|
||||||
GetShortPathNameW(package->files[index].TargetPath, argument, sz);
|
strcpyW(argument, package->files[index].TargetPath);
|
||||||
|
|
||||||
if (package->classes[i].Argument)
|
if (package->classes[i].Argument)
|
||||||
{
|
{
|
||||||
strcatW(argument,szSpace);
|
strcatW(argument,szSpace);
|
||||||
strcatW(argument,package->classes[i].Argument);
|
strcatW(argument,package->classes[i].Argument);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argument)
|
||||||
|
{
|
||||||
RegSetValueExW(hkey3,NULL,0,REG_SZ, (LPVOID)argument, size);
|
RegSetValueExW(hkey3,NULL,0,REG_SZ, (LPVOID)argument, size);
|
||||||
HeapFree(GetProcessHeap(),0,argument);
|
HeapFree(GetProcessHeap(),0,argument);
|
||||||
}
|
}
|
||||||
@ -5420,11 +5458,6 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
package->classes[i].Description);
|
package->classes[i].Description);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (package->classes[i].FileTypeMask)
|
|
||||||
{
|
|
||||||
FIXME("Process field 7\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (package->classes[i].IconPath)
|
if (package->classes[i].IconPath)
|
||||||
{
|
{
|
||||||
static const WCHAR szDefaultIcon[] =
|
static const WCHAR szDefaultIcon[] =
|
||||||
@ -5469,6 +5502,39 @@ static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||||||
|
|
||||||
RegCloseKey(hkey2);
|
RegCloseKey(hkey2);
|
||||||
|
|
||||||
|
/* if there is a FileTypeMask, register the FileType */
|
||||||
|
if (package->classes[i].FileTypeMask)
|
||||||
|
{
|
||||||
|
LPWSTR ptr, ptr2;
|
||||||
|
LPWSTR keyname;
|
||||||
|
INT index = 0;
|
||||||
|
ptr = package->classes[i].FileTypeMask;
|
||||||
|
while (ptr && *ptr)
|
||||||
|
{
|
||||||
|
ptr2 = strchrW(ptr,';');
|
||||||
|
if (ptr2)
|
||||||
|
*ptr2 = 0;
|
||||||
|
keyname = HeapAlloc(GetProcessHeap(),0,(strlenW(szFileType_fmt)+
|
||||||
|
strlenW(package->classes[i].CLSID) + 4)
|
||||||
|
* sizeof(WCHAR));
|
||||||
|
sprintfW(keyname,szFileType_fmt, package->classes[i].CLSID,
|
||||||
|
index);
|
||||||
|
|
||||||
|
RegCreateKeyW(HKEY_CLASSES_ROOT,keyname,&hkey2);
|
||||||
|
RegSetValueExW(hkey2,NULL,0,REG_SZ, (LPVOID)ptr,
|
||||||
|
strlenW(ptr)*sizeof(WCHAR));
|
||||||
|
RegCloseKey(hkey2);
|
||||||
|
HeapFree(GetProcessHeap(), 0, keyname);
|
||||||
|
|
||||||
|
if (ptr2)
|
||||||
|
ptr = ptr2+1;
|
||||||
|
else
|
||||||
|
ptr = NULL;
|
||||||
|
|
||||||
|
index ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uirow = MSI_CreateRecord(1);
|
uirow = MSI_CreateRecord(1);
|
||||||
|
|
||||||
MSI_RecordSetStringW(uirow,1,package->classes[i].CLSID);
|
MSI_RecordSetStringW(uirow,1,package->classes[i].CLSID);
|
||||||
|
Loading…
Reference in New Issue
Block a user