Create a macro to write a value to a subkey.

This commit is contained in:
Mike McCormack 2005-09-15 09:31:41 +00:00 committed by Alexandre Julliard
parent ec821b698b
commit 8a61b4ef16
1 changed files with 54 additions and 100 deletions

View File

@ -743,13 +743,13 @@ static void mark_mime_for_install( MSIMIME *mime )
mime->InstallMe = TRUE; mime->InstallMe = TRUE;
} }
static LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value ) LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value )
{ {
DWORD len = (lstrlenW(value) + 1) * sizeof (WCHAR); DWORD len = value ? (lstrlenW(value) + 1) * sizeof (WCHAR) : 0;
return RegSetValueExW( hkey, name, 0, REG_SZ, (LPBYTE)value, len ); return RegSetValueExW( hkey, name, 0, REG_SZ, (LPBYTE)value, len );
} }
static LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value ) LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value )
{ {
LPCWSTR p = value; LPCWSTR p = value;
while (*p) p += lstrlenW(p) + 1; while (*p) p += lstrlenW(p) + 1;
@ -757,70 +757,68 @@ static LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value )
(LPBYTE)value, (p + 1 - value) * sizeof(WCHAR) ); (LPBYTE)value, (p + 1 - value) * sizeof(WCHAR) );
} }
LONG msi_reg_set_val_dword( HKEY hkey, LPCWSTR name, DWORD val )
{
return RegSetValueExW( hkey, name, 0, REG_DWORD, (LPBYTE)&val, sizeof (DWORD) );
}
LONG msi_reg_set_subkey_val( HKEY hkey, LPCWSTR path, LPCWSTR name, LPCWSTR val )
{
HKEY hsubkey = 0;
LONG r;
r = RegCreateKeyW( hkey, path, &hsubkey );
if (r != ERROR_SUCCESS)
return r;
r = msi_reg_set_val_str( hsubkey, name, val );
RegCloseKey( hsubkey );
return r;
}
static UINT register_appid(MSIAPPID *appid, LPCWSTR app ) static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
{ {
static const WCHAR szAppID[] = { 'A','p','p','I','D',0 }; static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
static const WCHAR szRemoteServerName[] =
{'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
static const WCHAR szLocalService[] =
{'L','o','c','a','l','S','e','r','v','i','c','e',0};
static const WCHAR szService[] =
{'S','e','r','v','i','c','e','P','a','r','a','m','e','t','e','r','s',0};
static const WCHAR szDLL[] =
{'D','l','l','S','u','r','r','o','g','a','t','e',0};
static const WCHAR szActivate[] =
{'A','c','t','i','v','a','t','e','A','s','S','t','o','r','a','g','e',0};
static const WCHAR szY[] = {'Y',0};
static const WCHAR szRunAs[] = {'R','u','n','A','s',0};
static const WCHAR szUser[] =
{'I','n','t','e','r','a','c','t','i','v','e',' ','U','s','e','r',0};
HKEY hkey2,hkey3; HKEY hkey2,hkey3;
RegCreateKeyW(HKEY_CLASSES_ROOT,szAppID,&hkey2); RegCreateKeyW(HKEY_CLASSES_ROOT,szAppID,&hkey2);
RegCreateKeyW( hkey2, appid->AppID, &hkey3 ); RegCreateKeyW( hkey2, appid->AppID, &hkey3 );
RegCloseKey(hkey2);
msi_reg_set_val_str( hkey3, NULL, app ); msi_reg_set_val_str( hkey3, NULL, app );
if (appid->RemoteServerName) if (appid->RemoteServerName)
{
static const WCHAR szRemoteServerName[] =
{'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
msi_reg_set_val_str( hkey3, szRemoteServerName, appid->RemoteServerName ); msi_reg_set_val_str( hkey3, szRemoteServerName, appid->RemoteServerName );
}
if (appid->LocalServer) if (appid->LocalServer)
{
static const WCHAR szLocalService[] =
{'L','o','c','a','l','S','e','r','v','i','c','e',0};
msi_reg_set_val_str( hkey3, szLocalService, appid->LocalServer ); msi_reg_set_val_str( hkey3, szLocalService, appid->LocalServer );
}
if (appid->ServiceParameters) if (appid->ServiceParameters)
{
static const WCHAR szService[] =
{'S','e','r','v','i','c','e',
'P','a','r','a','m','e','t','e','r','s',0};
msi_reg_set_val_str( hkey3, szService, appid->ServiceParameters ); msi_reg_set_val_str( hkey3, szService, appid->ServiceParameters );
}
if (appid->DllSurrogate) if (appid->DllSurrogate)
{
static const WCHAR szDLL[] =
{'D','l','l','S','u','r','r','o','g','a','t','e',0};
msi_reg_set_val_str( hkey3, szDLL, appid->DllSurrogate ); msi_reg_set_val_str( hkey3, szDLL, appid->DllSurrogate );
}
if (appid->ActivateAtStorage) if (appid->ActivateAtStorage)
{
static const WCHAR szActivate[] =
{'A','c','t','i','v','a','t','e','A','s',
'S','t','o','r','a','g','e',0};
static const WCHAR szY[] = {'Y',0};
msi_reg_set_val_str( hkey3, szActivate, szY ); msi_reg_set_val_str( hkey3, szActivate, szY );
}
if (appid->RunAsInteractiveUser) if (appid->RunAsInteractiveUser)
{
static const WCHAR szRunAs[] = {'R','u','n','A','s',0};
static const WCHAR szUser[] =
{'I','n','t','e','r','a','c','t','i','v','e',' ',
'U','s','e','r',0};
msi_reg_set_val_str( hkey3, szRunAs, szUser ); msi_reg_set_val_str( hkey3, szRunAs, szUser );
}
RegCloseKey(hkey3); RegCloseKey(hkey3);
RegCloseKey(hkey2);
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
@ -968,17 +966,12 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
else else
progid = cls->ProgIDText; progid = cls->ProgIDText;
RegCreateKeyW(hkey2,szProgID,&hkey3); msi_reg_set_subkey_val( hkey2, szProgID, NULL, progid );
msi_reg_set_val_str( hkey3, NULL, progid );
RegCloseKey(hkey3);
if (cls->ProgID && cls->ProgID->VersionInd) if (cls->ProgID && cls->ProgID->VersionInd)
{ {
LPWSTR viprogid = strdupW( cls->ProgID->VersionInd->ProgID ); msi_reg_set_subkey_val( hkey2, szVIProgID, NULL,
RegCreateKeyW(hkey2,szVIProgID,&hkey3); cls->ProgID->VersionInd->ProgID );
msi_reg_set_val_str( hkey3, NULL, viprogid );
RegCloseKey(hkey3);
HeapFree(GetProcessHeap(), 0, viprogid);
} }
} }
@ -996,11 +989,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
static const WCHAR szDefaultIcon[] = static const WCHAR szDefaultIcon[] =
{'D','e','f','a','u','l','t','I','c','o','n',0}; {'D','e','f','a','u','l','t','I','c','o','n',0};
RegCreateKeyW(hkey2,szDefaultIcon,&hkey3); msi_reg_set_subkey_val( hkey2, szDefaultIcon, NULL, cls->IconPath );
msi_reg_set_val_str( hkey3, NULL, cls->IconPath );
RegCloseKey(hkey3);
} }
if (cls->DefInprocHandler) if (cls->DefInprocHandler)
@ -1008,20 +997,15 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
static const WCHAR szInproc[] = static const WCHAR szInproc[] =
{'I','n','p','r','o','c','H','a','n','d','l','e','r',0}; {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
RegCreateKeyW(hkey2,szInproc,&hkey3); msi_reg_set_subkey_val( hkey2, szInproc, NULL, cls->DefInprocHandler );
msi_reg_set_val_str( hkey3, NULL, cls->DefInprocHandler );
RegCloseKey(hkey3);
} }
if (cls->DefInprocHandler32) if (cls->DefInprocHandler32)
{ {
static const WCHAR szInproc32[] = static const WCHAR szInproc32[] =
{'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0}; {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
size = (strlenW(cls->DefInprocHandler32) + 1) * sizeof(WCHAR);
RegCreateKeyW(hkey2,szInproc32,&hkey3); msi_reg_set_subkey_val( hkey2, szInproc32, NULL, cls->DefInprocHandler32 );
msi_reg_set_val_str( hkey3, NULL, cls->DefInprocHandler32 );
RegCloseKey(hkey3);
} }
RegCloseKey(hkey2); RegCloseKey(hkey2);
@ -1042,9 +1026,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
strlenW(cls->clsid) + 4) * sizeof(WCHAR)); strlenW(cls->clsid) + 4) * sizeof(WCHAR));
sprintfW( keyname, szFileType_fmt, cls->clsid, index ); sprintfW( keyname, szFileType_fmt, cls->clsid, index );
RegCreateKeyW(HKEY_CLASSES_ROOT,keyname,&hkey2); msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, keyname, NULL, ptr );
msi_reg_set_val_str( hkey2, NULL, ptr );
RegCloseKey(hkey2);
HeapFree(GetProcessHeap(), 0, keyname); HeapFree(GetProcessHeap(), 0, keyname);
if (ptr2) if (ptr2)
@ -1073,7 +1055,7 @@ static UINT register_progid_base(MSIPACKAGE* package, MSIPROGID* progid,
static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 }; static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
static const WCHAR szDefaultIcon[] = static const WCHAR szDefaultIcon[] =
{'D','e','f','a','u','l','t','I','c','o','n',0}; {'D','e','f','a','u','l','t','I','c','o','n',0};
HKEY hkey,hkey2; HKEY hkey;
RegCreateKeyW(HKEY_CLASSES_ROOT,progid->ProgID,&hkey); RegCreateKeyW(HKEY_CLASSES_ROOT,progid->ProgID,&hkey);
@ -1082,13 +1064,9 @@ static UINT register_progid_base(MSIPACKAGE* package, MSIPROGID* progid,
if (progid->Class) if (progid->Class)
{ {
RegCreateKeyW(hkey,szCLSID,&hkey2); msi_reg_set_subkey_val( hkey, szCLSID, NULL, progid->Class->clsid );
msi_reg_set_val_str( hkey2, NULL, progid->Class->clsid );
if (clsid) if (clsid)
strcpyW( clsid, progid->Class->clsid ); strcpyW( clsid, progid->Class->clsid );
RegCloseKey(hkey2);
} }
else else
{ {
@ -1096,12 +1074,8 @@ static UINT register_progid_base(MSIPACKAGE* package, MSIPROGID* progid,
} }
if (progid->IconPath) if (progid->IconPath)
{ msi_reg_set_subkey_val( hkey, szDefaultIcon, NULL, progid->IconPath );
RegCreateKeyW(hkey,szDefaultIcon,&hkey2);
msi_reg_set_val_str( hkey2, NULL, progid->IconPath );
RegCloseKey(hkey2);
}
return ERROR_SUCCESS; return ERROR_SUCCESS;
} }
@ -1115,7 +1089,7 @@ static UINT register_progid(MSIPACKAGE *package, MSIPROGID* progid,
else else
{ {
DWORD disp; DWORD disp;
HKEY hkey,hkey2; HKEY hkey;
static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 }; static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
static const WCHAR szDefaultIcon[] = static const WCHAR szDefaultIcon[] =
{'D','e','f','a','u','l','t','I','c','o','n',0}; {'D','e','f','a','u','l','t','I','c','o','n',0};
@ -1136,29 +1110,17 @@ static UINT register_progid(MSIPACKAGE *package, MSIPROGID* progid,
rc = register_progid( package, progid->Parent, clsid ); rc = register_progid( package, progid->Parent, clsid );
/* clsid is same as parent */ /* clsid is same as parent */
RegCreateKeyW(hkey,szCLSID,&hkey2); msi_reg_set_subkey_val( hkey, szCLSID, NULL, clsid );
msi_reg_set_val_str( hkey2, NULL, clsid );
RegCloseKey(hkey2);
if (progid->Description) if (progid->Description)
msi_reg_set_val_str( hkey, NULL, progid->Description ); msi_reg_set_val_str( hkey, NULL, progid->Description );
if (progid->IconPath) if (progid->IconPath)
{ msi_reg_set_subkey_val( hkey, szDefaultIcon, NULL, progid->IconPath );
RegCreateKeyW(hkey,szDefaultIcon,&hkey2);
msi_reg_set_val_str( hkey2, NULL, progid->IconPath );
RegCloseKey(hkey2);
}
/* write out the current version */ /* write out the current version */
if (progid->CurVer) if (progid->CurVer)
{ msi_reg_set_subkey_val( hkey, szCurVer, NULL, progid->CurVer->ProgID );
RegCreateKeyW(hkey,szCurVer,&hkey2);
msi_reg_set_val_str( hkey2, NULL, progid->CurVer->ProgID );
RegCloseKey(hkey2);
}
RegCloseKey(hkey); RegCloseKey(hkey);
} }
@ -1265,9 +1227,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
if (verb->Command) if (verb->Command)
{ {
keyname = build_directory_name(3, progid, szShell, verb->Verb); keyname = build_directory_name(3, progid, szShell, verb->Verb);
RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key); msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, keyname, NULL, verb->Command );
msi_reg_set_val_str( key, NULL, verb->Command );
RegCloseKey(key);
HeapFree(GetProcessHeap(),0,keyname); HeapFree(GetProcessHeap(),0,keyname);
} }
@ -1277,9 +1237,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
{ {
*Sequence = verb->Sequence; *Sequence = verb->Sequence;
keyname = build_directory_name(2, progid, szShell); keyname = build_directory_name(2, progid, szShell);
RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key); msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, keyname, NULL, verb->Verb );
msi_reg_set_val_str( key, NULL, verb->Verb );
RegCloseKey(key);
HeapFree(GetProcessHeap(),0,keyname); HeapFree(GetProcessHeap(),0,keyname);
} }
} }
@ -1402,7 +1360,6 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
{ {
static const WCHAR szExten[] = static const WCHAR szExten[] =
{'E','x','t','e','n','s','i','o','n',0 }; {'E','x','t','e','n','s','i','o','n',0 };
HKEY hkey;
MSIRECORD *uirow; MSIRECORD *uirow;
MSIMIME *mt; MSIMIME *mt;
@ -1447,8 +1404,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
key = HeapAlloc(GetProcessHeap(),0,(strlenW(mime)+strlenW(fmt)+1) * key = HeapAlloc(GetProcessHeap(),0,(strlenW(mime)+strlenW(fmt)+1) *
sizeof(WCHAR)); sizeof(WCHAR));
sprintfW(key,fmt,mime); sprintfW(key,fmt,mime);
RegCreateKeyW(HKEY_CLASSES_ROOT,key,&hkey); msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExten, extension );
msi_reg_set_val_str( hkey, szExten, extension );
HeapFree(GetProcessHeap(),0,extension); HeapFree(GetProcessHeap(),0,extension);
HeapFree(GetProcessHeap(),0,key); HeapFree(GetProcessHeap(),0,key);
@ -1456,8 +1412,6 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
if (mt->clsid) if (mt->clsid)
FIXME("Handle non null for field 3\n"); FIXME("Handle non null for field 3\n");
RegCloseKey(hkey);
uirow = MSI_CreateRecord(2); uirow = MSI_CreateRecord(2);
MSI_RecordSetStringW(uirow,1,mt->ContentType); MSI_RecordSetStringW(uirow,1,mt->ContentType);
MSI_RecordSetStringW(uirow,2,exten); MSI_RecordSetStringW(uirow,2,exten);