fix registry writing when using one of the standard keys

svn: r5799
This commit is contained in:
Matthew Flatt 2007-03-20 03:28:34 +00:00
parent 8928f80384
commit 3b65a7a016
2 changed files with 61 additions and 49 deletions

View File

@ -1545,7 +1545,7 @@ static Scheme_Object *wxPlaySound(int argc, Scheme_Object **argv)
SCHEME_GUARD_FILE_READ); SCHEME_GUARD_FILE_READ);
#ifdef wx_msw #ifdef wx_msw
ok = PlaySound(f, NULL, async ? SND_ASYNC : SND_SYNC); ok = PlaySoundW(wxWIDE_STRING(f), NULL, async ? SND_ASYNC : SND_SYNC);
#endif #endif
#ifdef wx_mac #ifdef wx_mac
{ {

View File

@ -152,6 +152,64 @@ void wxInitUserResource(char *s)
wxUserResourceFile = s; wxUserResourceFile = s;
} }
static int wxDoResource(HKEY key, const char *entry, char **value_get, char *value_set)
{
int key_needs_close = 0, elen, sep_pos, success = 0;
unsigned long rlen;
/* Split the value name from the registry entry: */
elen = strlen(entry);
for (sep_pos = elen - 1; (sep_pos >= 0) && (entry[sep_pos] != '\\'); sep_pos -= 1) {
}
if (sep_pos >= 0) {
HKEY hKey;
char *new_entry;
new_entry = new char[sep_pos + 1];
memcpy(new_entry, entry, sep_pos);
new_entry[sep_pos] = 0;
/* Get a key for the entry: */
if (RegOpenKeyEx(key, new_entry, 0, value_get ? KEY_QUERY_VALUE : KEY_SET_VALUE, &hKey)
== ERROR_SUCCESS) {
key = hKey;
key_needs_close = 1;
} else
return FALSE;
/* name starts after the separator */
sep_pos++;
} else
sep_pos = 0;
if (value_get) {
/* Get the value. Start by finding out how big it is: */
rlen = 0;
if (RegQueryValueEx(key, entry XFORM_OK_PLUS sep_pos, NULL, NULL, NULL,
&rlen) == ERROR_SUCCESS) {
char *res;
res = new char[rlen + 1];
if (RegQueryValueEx(key, entry XFORM_OK_PLUS sep_pos, NULL, NULL,
(unsigned char *)res, &rlen) == ERROR_SUCCESS) {
res[rlen + 1] = 0;
*value_get = res;
success = 1;
}
}
} else {
if (RegSetValueEx(key, entry XFORM_OK_PLUS sep_pos, 0,
REG_SZ, (BYTE *)value_set, strlen(value_set))
== ERROR_SUCCESS) {
success = 1;
} else
success = 0;
}
if (key_needs_close)
RegCloseKey(key);
return success;
}
Bool wxWriteResource(const char *section, const char *entry, char *value, const char *file) Bool wxWriteResource(const char *section, const char *entry, char *value, const char *file)
{ {
HKEY key; HKEY key;
@ -167,10 +225,7 @@ Bool wxWriteResource(const char *section, const char *entry, char *value, const
#undef TRY_HKEY #undef TRY_HKEY
if (key) { if (key) {
if (RegSetValue(key, entry, REG_SZ, value, strlen(value)) == ERROR_SUCCESS) { return wxDoResource(key, entry, NULL, value);
return TRUE;
}
return FALSE;
} else { } else {
if (file) { if (file) {
char *naya; char *naya;
@ -237,50 +292,7 @@ Bool wxGetResource(const char *section, const char *entry, char **value, const c
#undef TRY_HKEY #undef TRY_HKEY
if (key) { if (key) {
int key_needs_close = 0, elen, sep_pos, success = 0; return wxDoResource(key, entry, value, NULL);
unsigned long rlen;
/* Split the value name from the registry entry: */
elen = strlen(entry);
for (sep_pos = elen - 1; (sep_pos >= 0) && (entry[sep_pos] != '\\'); sep_pos -= 1) {
}
if (sep_pos >= 0) {
HKEY hKey;
char *new_entry;
new_entry = new char[sep_pos + 1];
memcpy(new_entry, entry, sep_pos);
new_entry[sep_pos] = 0;
/* Get a key for the entry: */
if (RegOpenKeyEx(key, new_entry, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
key = hKey;
key_needs_close = 1;
} else
return FALSE;
/* name starts after the separator */
sep_pos++;
} else
sep_pos = 0;
/* Get the value. Start by finding out how big it is: */
rlen = 0;
if (RegQueryValueEx(key, entry XFORM_OK_PLUS sep_pos, NULL, NULL, NULL,
&rlen) == ERROR_SUCCESS) {
char *res;
res = new char[rlen + 1];
if (RegQueryValueEx(key, entry XFORM_OK_PLUS sep_pos, NULL, NULL,
(unsigned char *)res, &rlen) == ERROR_SUCCESS) {
res[rlen + 1] = 0;
*value = res;
success = 1;
}
}
if (key_needs_close)
RegCloseKey(key);
return success;
} else { } else {
static const char defunkt[] = "$$default"; static const char defunkt[] = "$$default";
int no_file = !file; int no_file = !file;