Hi!
Does anybody have a C algorithm to rename a registry section using the Win32 API?
I need such a thing for winecfg, but Win32 doesn't seem to have a RegKeyRename api-call...
Grtz, Robert
On December 31, 2003 08:00 am, Robert van Herk wrote:
I need such a thing for winecfg, but Win32 doesn't seem to have a RegKeyRename api-call...
Why do you need the rename a key in winecfg?
Dimitrie O. Paun wrote:
On December 31, 2003 08:00 am, Robert van Herk wrote:
I need such a thing for winecfg, but Win32 doesn't seem to have a RegKeyRename api-call...
Why do you need the rename a key in winecfg?
When someone configures app1.exe, and later on decides that he actually meant app2.exe, he might want to rename app1.exe to app2.exe, and so migrate all the settings.
On Thu, 2004-01-01 at 13:38, Robert van Herk wrote:
When someone configures app1.exe, and later on decides that he actually meant app2.exe, he might want to rename app1.exe to app2.exe, and so migrate all the settings.
Oh, I see.... I was intending to simply not support that :)
What you want is a deep tree copy function. You can then do renaming by copying the contents of a key to a new key, and deleting the old one.
Here's one I just knocked up. Total pain in the ass isn't it! Hopefully when we get a standard config system on Linux it will be a bit better designed....
/* Copy the values and subkeys of the registry key source to dest recursively. * Returns NO_ERROR if the copy completed OK, otherwise it propagates the error. */ LONG copytree(HKEY source, HKEY dest) { int i = 0; LONG res;
/* first of all, copy the values */ while (1) { char valname[MAX_VALUE_NAME]; DWORD valname_size = sizeof(valname); DWORD size; DWORD typecode; char *value; /* determine size of the buffer we'll need */ res = RegEnumValue(source, i, valname, &valname_size, NULL, &typecode, NULL, &size); if (res == ERROR_NO_MORE_ITEMS) break; if (res != NO_ERROR) return res;
value = HeapAlloc(GetProcessHeap(), 0, size); if (!value) return ERROR_OUTOFMEMORY;
valname_size = sizeof(valname); /* RegEnumValue blasts this even though it doesn't need to */ res = RegEnumValue(source, i, valname, &valname_size, NULL, &typecode, value, &size); if (res != NO_ERROR) return res;
res = RegSetValueEx(dest, valname, 0, typecode, value, size); if (res != NO_ERROR) return res;
HeapFree(GetProcessHeap(), 0, value); i++; }
/* for each subkey, create an equivalent under dest then recurse into ourselves to complete the copy */ i = 0; while (1) { HKEY subkey_src, subkey_dest; char name[MAX_KEY_LENGTH]; DWORD size = sizeof(name); FILETIME time;
res = RegEnumKeyEx(source, i, name, &size, NULL, NULL, NULL, &time); if (res == ERROR_NO_MORE_ITEMS) break; if (res != NO_ERROR) return res;
/* create the destination subkey */ res = RegCreateKey(dest, name, &subkey_dest); if (res != NO_ERROR) return res;
/* open the source subkey */ res = RegOpenKey(source, name, &subkey_src); if (res != NO_ERROR) return res;
/* perform the recursive copy */ res = copytree(subkey_src, subkey_dest); if (res != NO_ERROR) return res;
i++; } return NO_ERROR; }
Hope that helps! thanks -mike
On January 1, 2004 08:38 am, Robert van Herk wrote:
When someone configures app1.exe, and later on decides that he actually meant app2.exe, he might want to rename app1.exe to app2.exe, and so migrate all the settings.
I'd say don't support that. At least for now, it's not that important a functionality to worry about it...
Dimitrie O. Paun wrote:
On January 1, 2004 08:38 am, Robert van Herk wrote:
When someone configures app1.exe, and later on decides that he actually meant app2.exe, he might want to rename app1.exe to app2.exe, and so migrate all the settings.
I'd say don't support that. At least for now, it's not that important a functionality to worry about it...
Hm, maybe you're right. I will leave it for a moment then, and maybe include it in the future.
Thanx though for all the help, guys.
Grtz, Robert