///////////////////////////////////////////////////////////////////////////////
-// Name: msw/registry.cpp
+// Name: src/msw/registry.cpp
// Purpose: implementation of registry classes and functions
// Author: Vadim Zeitlin
// Modified by:
// - add high level functions (RegisterOleServer, ...)
///////////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "registry.h"
-#endif
-
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
-// other wxWidgets headers
-#include "wx/string.h"
-#include "wx/intl.h"
-#include "wx/log.h"
-#include "wx/file.h"
-#include "wx/wfstream.h"
+#ifndef WX_PRECOMP
+ #include "wx/msw/wrapwin.h"
+ #include "wx/string.h"
+ #include "wx/intl.h"
+ #include "wx/log.h"
+#endif
-// Windows headers
-#include "wx/msw/wrapwin.h"
+#include "wx/file.h"
+#include "wx/wfstream.h"
+// Windows headers
#ifdef __WXWINCE__
#include "wx/msw/private.h"
#include <winbase.h>
typedef unsigned char *RegString;
typedef BYTE* RegBinary;
+#ifndef HKEY_PERFORMANCE_DATA
+ #define HKEY_PERFORMANCE_DATA ((HKEY)0x80000004)
+#endif
+
+#ifndef HKEY_CURRENT_CONFIG
+ #define HKEY_CURRENT_CONFIG ((HKEY)0x80000005)
+#endif
+
+#ifndef HKEY_DYN_DATA
+ #define HKEY_DYN_DATA ((HKEY)0x80000006)
+#endif
+
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
{ HKEY_CURRENT_USER, wxT("HKEY_CURRENT_USER"), wxT("HKCU") },
{ HKEY_LOCAL_MACHINE, wxT("HKEY_LOCAL_MACHINE"), wxT("HKLM") },
{ HKEY_USERS, wxT("HKEY_USERS"), wxT("HKU") }, // short name?
-#ifndef __WXWINCE__
{ HKEY_PERFORMANCE_DATA, wxT("HKEY_PERFORMANCE_DATA"), wxT("HKPD") },
-#endif
-#ifdef HKEY_CURRENT_CONFIG
{ HKEY_CURRENT_CONFIG, wxT("HKEY_CURRENT_CONFIG"), wxT("HKCC") },
-#endif
-#ifdef HKEY_DYN_DATA
{ HKEY_DYN_DATA, wxT("HKEY_DYN_DATA"), wxT("HKDD") }, // short name?
-#endif
};
// the registry name separator (perhaps one day MS will change it to '/' ;-)
{
wxString strRoot = strKey.BeforeFirst(REG_SEPARATOR);
- HKEY hRootKey = 0;
size_t ui;
for ( ui = 0; ui < nStdKeys; ui++ ) {
if ( strRoot.CmpNoCase(aStdKeys[ui].szName) == 0 ||
strRoot.CmpNoCase(aStdKeys[ui].szShortName) == 0 ) {
- hRootKey = aStdKeys[ui].hkey;
break;
}
}
if ( ui == nStdKeys ) {
wxFAIL_MSG(wxT("invalid key prefix in wxRegKey::ExtractKeyName."));
- hRootKey = HKEY_CLASSES_ROOT;
+ ui = HKCR;
}
else {
strKey = strKey.After(REG_SEPARATOR);
strKey.Truncate(strKey.Len() - 1);
}
- return (wxRegKey::StdKey)(int)hRootKey;
+ return (StdKey)ui;
}
wxRegKey::StdKey wxRegKey::GetStdKeyFromHkey(WXHKEY hkey)
{
for ( size_t ui = 0; ui < nStdKeys; ui++ ) {
- if ( (int) aStdKeys[ui].hkey == (int) hkey )
+ if ( aStdKeys[ui].hkey == (HKEY)hkey )
return (StdKey)ui;
}
bool wxRegKey::DeleteValue(const wxChar *szValue)
{
- if ( !Open() )
- return false;
+ if ( !Open() )
+ return false;
m_dwLastError = RegDeleteValue((HKEY) m_hKey, WXSTRINGCAST szValue);
// deleting a value which doesn't exist is not considered an error
if ( (m_dwLastError != ERROR_SUCCESS) &&
- (m_dwLastError != ERROR_FILE_NOT_FOUND) ) {
- wxLogSysError(m_dwLastError, _("Can't delete value '%s' from key '%s'"),
- szValue, GetName().c_str());
- return false;
+ (m_dwLastError != ERROR_FILE_NOT_FOUND) )
+ {
+ wxLogSysError(m_dwLastError, _("Can't delete value '%s' from key '%s'"),
+ szValue, GetName().c_str());
+ return false;
}
- return true;
+ return true;
}
// ----------------------------------------------------------------------------
// return true if value exists
bool wxRegKey::HasValue(const wxChar *szValue) const
{
- // this function should be silent, so suppress possible messages from Open()
- wxLogNull nolog;
+ // this function should be silent, so suppress possible messages from Open()
+ wxLogNull nolog;
if ( !CONST_CAST Open(Read) )
return false;
bool wxRegKey::QueryValue(const wxChar *szValue, wxMemoryBuffer& buffer) const
{
- if ( CONST_CAST Open() ) {
+ if ( CONST_CAST Open(Read) ) {
// first get the type and size of the data
DWORD dwType, dwSize;
m_dwLastError = RegQueryValueEx((HKEY) m_hKey, WXSTRINGCAST szValue, RESERVED,
bool wxRegKey::QueryValue(const wxChar *szValue,
wxString& strValue,
- bool raw) const
+ bool WXUNUSED_IN_WINCE(raw)) const
{
- if ( CONST_CAST Open(Read) ) {
-
- // first get the type and size of the data
- DWORD dwType, dwSize;
- m_dwLastError = RegQueryValueEx((HKEY) m_hKey, WXSTRINGCAST szValue, RESERVED,
- &dwType, NULL, &dwSize);
- if ( m_dwLastError == ERROR_SUCCESS ) {
- if ( !dwSize ) {
- // must treat this case specially as GetWriteBuf() doesn't like
- // being called with 0 size
- strValue.Empty();
- }
- else {
- m_dwLastError = RegQueryValueEx((HKEY) m_hKey,
- WXSTRINGCAST szValue,
- RESERVED,
- &dwType,
- (RegString)(wxChar*)wxStringBuffer(strValue, dwSize),
- &dwSize);
+ if ( CONST_CAST Open(Read) )
+ {
- // expand the var expansions in the string unless disabled
-#ifndef __WXWINCE__
- if ( (dwType == REG_EXPAND_SZ) && !raw )
+ // first get the type and size of the data
+ DWORD dwType=REG_NONE, dwSize=0;
+ m_dwLastError = RegQueryValueEx((HKEY) m_hKey, WXSTRINGCAST szValue, RESERVED,
+ &dwType, NULL, &dwSize);
+ if ( m_dwLastError == ERROR_SUCCESS )
+ {
+ if ( !dwSize )
+ {
+ // must treat this case specially as GetWriteBuf() doesn't like
+ // being called with 0 size
+ strValue.Empty();
+ }
+ else
{
- DWORD dwExpSize = ::ExpandEnvironmentStrings(strValue, NULL, 0);
- bool ok = dwExpSize != 0;
- if ( ok )
+ m_dwLastError = RegQueryValueEx((HKEY) m_hKey,
+ WXSTRINGCAST szValue,
+ RESERVED,
+ &dwType,
+ (RegString)(wxChar*)wxStringBuffer(strValue, dwSize),
+ &dwSize);
+
+ // expand the var expansions in the string unless disabled
+#ifndef __WXWINCE__
+ if ( (dwType == REG_EXPAND_SZ) && !raw )
{
- wxString strExpValue;
- ok = ::ExpandEnvironmentStrings
- (
- strValue,
- wxStringBuffer(strExpValue, dwExpSize),
- dwExpSize
- ) != 0;
- strValue = strExpValue;
- }
+ DWORD dwExpSize = ::ExpandEnvironmentStrings(strValue, NULL, 0);
+ bool ok = dwExpSize != 0;
+ if ( ok )
+ {
+ wxString strExpValue;
+ ok = ::ExpandEnvironmentStrings(strValue,
+ wxStringBuffer(strExpValue, dwExpSize),
+ dwExpSize
+ ) != 0;
+ strValue = strExpValue;
+ }
- if ( !ok )
- {
- wxLogLastError(_T("ExpandEnvironmentStrings"));
+ if ( !ok )
+ {
+ wxLogLastError(_T("ExpandEnvironmentStrings"));
+ }
}
- }
-#else
- wxUnusedVar(raw);
#endif
- // __WXWINCE__
- }
+ // __WXWINCE__
+ }
- if ( m_dwLastError == ERROR_SUCCESS ) {
- // check that it was the right type
- wxASSERT_MSG( !IsNumericValue(szValue),
- wxT("Type mismatch in wxRegKey::QueryValue().") );
+ if ( m_dwLastError == ERROR_SUCCESS )
+ {
+ // check that it was the right type
+ wxASSERT_MSG( !IsNumericValue(szValue),
+ wxT("Type mismatch in wxRegKey::QueryValue().") );
- return true;
+ return true;
+ }
}
- }
- }
+ }
- wxLogSysError(m_dwLastError, _("Can't read value of '%s'"),
- GetFullName(this, szValue));
- return false;
+ wxLogSysError(m_dwLastError, _("Can't read value of '%s'"),
+ GetFullName(this, szValue));
+ return false;
}
bool wxRegKey::SetValue(const wxChar *szValue, const wxString& strValue)
{
if ( CONST_CAST Open() ) {
m_dwLastError = RegSetValueEx((HKEY) m_hKey, szValue, (DWORD) RESERVED, REG_SZ,
- (RegString)strValue.c_str(),
+ (RegString)strValue.wx_str(),
(strValue.Len() + 1)*sizeof(wxChar));
if ( m_dwLastError == ERROR_SUCCESS )
return true;
wxCharBuffer name(s.mb_str());
ostr.Write(name, strlen(name));
#else
- ostr.Write(s, s.length());
+ ostr.Write(s.mb_str(), s.length());
#endif
return ostr.IsOk();
return s_str.c_str();
}
-void RemoveTrailingSeparator(wxString& str)
+inline void RemoveTrailingSeparator(wxString& str)
{
if ( !str.empty() && str.Last() == REG_SEPARATOR )
str.Truncate(str.Len() - 1);
}
-