ulong *pnMaxValueLen) const
#endif
{
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__TWIN32__)
m_dwLastError = ::RegQueryInfoKey
(
(HKEY) m_hKey,
}
}
+ // prevent a buggy program from erasing one of the root registry keys or an
+ // immediate subkey (i.e. one which doesn't have '\\' inside) of any other
+ // key except HKCR (HKCR has some "deleteable" subkeys)
+ if ( m_strKey.IsEmpty() || (m_hRootKey != HKCR &&
+ m_strKey.Find(REG_SEPARATOR) == wxNOT_FOUND) ) {
+ wxLogError(_("Registry key '%s' is needed for normal system operation,\n"
+ "deleting it will leave your system in unusable state:\n"
+ "operation aborted."), GetFullName(this));
+
+ return FALSE;
+ }
+
// we can't delete keys while enumerating because it confuses GetNextKey, so
// we first save the key names and then delete them all
wxArrayString astrSubkeys;
if ( !Open() )
return FALSE;
- #ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__TWIN32__)
m_dwLastError = RegDeleteValue((HKEY) m_hKey, (char*) (const char*) szValue);
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, _("can't delete value '%s' from key '%s'"),
return FALSE;
}
-wxRegKey::ValueType wxRegKey::GetValueType(const char *szValue)
+wxRegKey::ValueType wxRegKey::GetValueType(const char *szValue) const
{
#ifdef __WIN32__
- if ( !Open() )
+ if ( ! CONST_CAST Open() )
return Type_None;
DWORD dwType;
#ifdef __WIN32__
bool wxRegKey::SetValue(const char *szValue, long lValue)
{
+#ifdef __TWIN32__
+ wxFAIL_MSG("RegSetValueEx not implemented by TWIN32");
+ return FALSE;
+#else
if ( CONST_CAST Open() ) {
m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, (DWORD) RESERVED, REG_DWORD,
(RegString)&lValue, sizeof(lValue));
wxLogSysError(m_dwLastError, _("can't set value of '%s'"),
GetFullName(this, szValue));
return FALSE;
+#endif
}
bool wxRegKey::QueryValue(const char *szValue, long *plValue) const
bool wxRegKey::SetValue(const char *szValue, const wxString& strValue)
{
if ( CONST_CAST Open() ) {
- #ifdef __WIN32__
+#if defined( __WIN32__) && !defined(__TWIN32__)
m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, (DWORD) RESERVED, REG_SZ,
(RegString)strValue.c_str(),
strValue.Len() + 1);
if ( lIndex == -1 )
return FALSE;
- #ifdef __WIN32__
+#if defined( __WIN32__) && !defined(__TWIN32__)
char szValueName[1024]; // @@ use RegQueryInfoKey...
DWORD dwValueLen = WXSIZEOF(szValueName);
return TRUE;
}
+// returns TRUE if the value contains a number (else it's some string)
+bool wxRegKey::IsNumericValue(const char *szValue) const
+ {
+ ValueType type = GetValueType(szValue);
+ switch ( type ) {
+ case Type_Dword:
+ case Type_Dword_little_endian:
+ case Type_Dword_big_endian:
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+ }
+
// ============================================================================
// implementation of global private functions
// ============================================================================