// Created: 03.04.98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows licence
// TODO: - parsing of registry key names
// - support of other (than REG_SZ/REG_DWORD) registry types
// - add high level functions (RegisterOleServer, ...)
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
-// @ const_cast<> is not yet supported by all compilers
+
+// const_cast<> is not yet supported by all compilers
#define CONST_CAST ((wxRegKey *)this)->
-#if !USE_MUTABLE
- #define m_dwLastError CONST_CAST m_dwLastError
-#endif
+// and neither is mutable which m_dwLastError should be
+#define m_dwLastError CONST_CAST m_dwLastError
// ----------------------------------------------------------------------------
// non member functions
wxRegKey::wxRegKey()
{
- m_hKey = 0;
m_hRootKey = (WXHKEY) aStdKeys[HKCR].hkey;
- m_dwLastError = 0;
+
+ Init();
}
wxRegKey::wxRegKey(const wxString& strKey) : m_strKey(strKey)
{
m_hRootKey = (WXHKEY) aStdKeys[ExtractKeyName(m_strKey)].hkey;
- m_hKey = (WXHKEY) NULL;
- m_dwLastError = 0;
+
+ Init();
}
// parent is a predefined (and preopened) key
{
RemoveTrailingSeparator(m_strKey);
m_hRootKey = (WXHKEY) aStdKeys[keyParent].hkey;
- m_hKey = (WXHKEY) NULL;
- m_dwLastError = 0;
+
+ Init();
}
// parent is a normal regkey
RemoveTrailingSeparator(m_strKey);
m_hRootKey = keyParent.m_hRootKey;
- m_hKey = (WXHKEY) NULL;
- m_dwLastError = 0;
+
+ Init();
}
// dtor closes the key releasing system resource
Close();
// combine our name with parent's to get the full name
- m_strKey = keyParent.m_strKey;
+
+ // NB: this method is called by wxRegConfig::SetPath() which is a performance
+ // critical function and so it preallocates space for our m_strKey to
+ // gain some speed - this is why we only use += here and not = which
+ // would just free the prealloc'd buffer and would have to realloc it the
+ // next line!
+ m_strKey.clear();
+ m_strKey += keyParent.m_strKey;
if ( !strKey.IsEmpty() && strKey[0] != REG_SEPARATOR )
m_strKey += REG_SEPARATOR;
m_strKey += strKey;
// returns the full name of the key (prefix is abbreviated if bShortPrefix)
wxString wxRegKey::GetName(bool bShortPrefix) const
{
- StdKey key = GetStdKeyFromHkey((StdKey) m_hRootKey);
+ StdKey key = GetStdKeyFromHkey((WXHKEY) m_hRootKey);
wxString str = bShortPrefix ? aStdKeys[key].szShortName
: aStdKeys[key].szName;
if ( !m_strKey.IsEmpty() )
- str << "\\" << m_strKey;
+ str << _T("\\") << m_strKey;
return str;
}
size_t *pnValues,
size_t *pnMaxValueLen) const
{
-#if defined(__WIN32__) && !defined(__TWIN32__)
+#if defined(__WIN32__)
// old gcc headers incorrectly prototype RegQueryInfoKey()
-#ifdef __GNUWIN32_OLD__
+#if defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)
#define REG_PARAM (size_t *)
#else
#define REG_PARAM (LPDWORD)
{
if ( IsOpened() ) {
m_dwLastError = RegCloseKey((HKEY) m_hKey);
+ m_hKey = 0;
+
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, _("Can't close registry key '%s'"),
GetName().c_str());
- m_hKey = 0;
return FALSE;
}
- else {
- m_hKey = 0;
- }
}
return TRUE;
if ( !Open() )
return FALSE;
-#if defined(__WIN32__) && !defined(__TWIN32__)
+#if defined(__WIN32__)
m_dwLastError = RegDeleteValue((HKEY) m_hKey, WXSTRINGCAST szValue);
if ( m_dwLastError != ERROR_SUCCESS ) {
wxLogSysError(m_dwLastError, _("Can't delete value '%s' from key '%s'"),
szValue, GetName().c_str());
return FALSE;
}
- #else //WIN16
+#else //WIN16
// named registry values don't exist in Win16 world
wxASSERT( IsEmpty(szValue) );
GetName().c_str());
return FALSE;
}
- #endif //WIN16/32
+#endif //WIN16/32
return TRUE;
}
#ifdef __WIN32__
bool wxRegKey::SetValue(const wxChar *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 wxChar *szValue, long *plValue) const
bool wxRegKey::SetValue(const wxChar *szValue, const wxString& strValue)
{
if ( CONST_CAST Open() ) {
-#if defined( __WIN32__) && !defined(__TWIN32__)
+#if defined( __WIN32__)
m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, (DWORD) RESERVED, REG_SZ,
(RegString)strValue.c_str(),
(strValue.Len() + 1)*sizeof(wxChar));
if ( m_dwLastError == ERROR_SUCCESS )
return TRUE;
- #else //WIN16
+#else //WIN16
// named registry values don't exist in Win16
wxASSERT( IsEmpty(szValue) );
m_dwLastError = RegSetValue((HKEY) m_hKey, NULL, REG_SZ, strValue, NULL);
if ( m_dwLastError == ERROR_SUCCESS )
return TRUE;
- #endif //WIN16/32
+#endif //WIN16/32
}
wxLogSysError(m_dwLastError, _("Can't set value of '%s'"),
return FALSE;
}
-wxRegKey::operator wxString() const
+wxString wxRegKey::QueryDefaultValue() const
{
wxString str;
QueryValue(NULL, str);
if ( lIndex == -1 )
return FALSE;
-#if defined( __WIN32__) && !defined(__TWIN32__)
+#if defined( __WIN32__)
wxChar szValueName[1024]; // @@ use RegQueryInfoKey...
DWORD dwValueLen = WXSIZEOF(szValueName);
}
strValueName = szValueName;
- #else //WIN16
+#else //WIN16
// only one unnamed value
wxASSERT( lIndex == 0 );
lIndex = -1;
strValueName.Empty();
- #endif
+#endif
return TRUE;
}