X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/886dd7d28e50c003cc88b81b968d487a3c17b0d7..d3e780ecdf69233c872d51216eedbc64a1b6db25:/src/msw/registry.cpp diff --git a/src/msw/registry.cpp b/src/msw/registry.cpp index c9111fbda5..72515030b0 100644 --- a/src/msw/registry.cpp +++ b/src/msw/registry.cpp @@ -12,7 +12,7 @@ // - add high level functions (RegisterOleServer, ...) /////////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "registry.h" #endif @@ -36,7 +36,13 @@ #define WIN32_LEAN_AND_MEAN */ -#include +#include "wx/msw/wrapwin.h" + +#ifdef __WXWINCE__ +#include "wx/msw/private.h" +#include +#include +#endif // other std headers #include // for _MAX_PATH @@ -71,10 +77,12 @@ aStdKeys[] = { 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") }, -#if WINVER >= 0x0400 +#endif +#if WINVER >= 0x0400 && !defined(__WXWINCE__) { HKEY_CURRENT_CONFIG, wxT("HKEY_CURRENT_CONFIG"), wxT("HKCC") }, -#ifndef __GNUWIN32__ +#if !defined(__GNUWIN32__) && !defined(__WXWINCE__) { HKEY_DYN_DATA, wxT("HKEY_DYN_DATA"), wxT("HKDD") }, // short name? #endif //GNUWIN32 #endif //WINVER >= 4.0 @@ -86,7 +94,7 @@ aStdKeys[] = // useful for Windows programmers: makes somewhat more clear all these zeroes // being passed to Windows APIs -#define RESERVED (NULL) +#define RESERVED (0) // ---------------------------------------------------------------------------- // macros @@ -127,7 +135,7 @@ const size_t wxRegKey::nStdKeys = WXSIZEOF(aStdKeys); const wxChar *wxRegKey::GetStdKeyName(size_t key) { // return empty string if key is invalid - wxCHECK_MSG( key < nStdKeys, wxT(""), wxT("invalid key in wxRegKey::GetStdKeyName") ); + wxCHECK_MSG( key < nStdKeys, wxEmptyString, wxT("invalid key in wxRegKey::GetStdKeyName") ); return aStdKeys[key].szName; } @@ -135,7 +143,7 @@ const wxChar *wxRegKey::GetStdKeyName(size_t key) const wxChar *wxRegKey::GetStdKeyShortName(size_t key) { // return empty string if key is invalid - wxCHECK( key < nStdKeys, wxT("") ); + wxCHECK( key < nStdKeys, wxEmptyString ); return aStdKeys[key].szShortName; } @@ -366,38 +374,56 @@ bool wxRegKey::GetKeyInfo(size_t *pnSubKeys, // ---------------------------------------------------------------------------- // opens key (it's not an error to call Open() on an already opened key) -bool wxRegKey::Open() +bool wxRegKey::Open(AccessMode mode) { - if ( IsOpened() ) - return TRUE; + if ( IsOpened() ) + return TRUE; + + HKEY tmpKey; + m_dwLastError = ::RegOpenKeyEx + ( + (HKEY) m_hRootKey, + m_strKey, + RESERVED, + mode == Read ? KEY_READ : KEY_ALL_ACCESS, + &tmpKey + ); + + if ( m_dwLastError != ERROR_SUCCESS ) + { + wxLogSysError(m_dwLastError, _("Can't open registry key '%s'"), + GetName().c_str()); + return FALSE; + } - HKEY tmpKey; - m_dwLastError = RegOpenKey((HKEY) m_hRootKey, m_strKey, &tmpKey); - if ( m_dwLastError != ERROR_SUCCESS ) { - wxLogSysError(m_dwLastError, _("Can't open registry key '%s'"), - GetName().c_str()); - return FALSE; - } - else - { m_hKey = (WXHKEY) tmpKey; return TRUE; - } } // creates key, failing if it exists and !bOkIfExists bool wxRegKey::Create(bool bOkIfExists) { // check for existence only if asked (i.e. order is important!) - if ( !bOkIfExists && Exists() ) { + if ( !bOkIfExists && Exists() ) return FALSE; - } if ( IsOpened() ) return TRUE; HKEY tmpKey; +#ifdef __WXWINCE__ + DWORD disposition; + m_dwLastError = RegCreateKeyEx((HKEY) m_hRootKey, m_strKey, + NULL, // reserved + NULL, // class string + 0, + 0, + NULL, + &tmpKey, + &disposition); +#else m_dwLastError = RegCreateKey((HKEY) m_hRootKey, m_strKey, &tmpKey); +#endif if ( m_dwLastError != ERROR_SUCCESS ) { wxLogSysError(m_dwLastError, _("Can't create registry key '%s'"), GetName().c_str()); @@ -657,7 +683,9 @@ bool wxRegKey::DeleteSelf() Close(); m_dwLastError = RegDeleteKey((HKEY) m_hRootKey, m_strKey); - if ( m_dwLastError != ERROR_SUCCESS ) { + // deleting a key 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 key '%s'"), GetName().c_str()); return FALSE; @@ -846,16 +874,15 @@ bool wxRegKey::QueryValue(const wxChar *szValue, strValue.Empty(); } else { - RegString pBuf = (RegString)strValue.GetWriteBuf(dwSize); m_dwLastError = RegQueryValueEx((HKEY) m_hKey, WXSTRINGCAST szValue, RESERVED, &dwType, - pBuf, + (RegString)(wxChar*)wxStringBuffer(strValue, dwSize), &dwSize); - strValue.UngetWriteBuf(); // expand the var expansions in the string unless disabled +#ifndef __WXWINCE__ if ( (dwType == REG_EXPAND_SZ) && !raw ) { DWORD dwExpSize = ::ExpandEnvironmentStrings(strValue, NULL, 0); @@ -866,10 +893,9 @@ bool wxRegKey::QueryValue(const wxChar *szValue, ok = ::ExpandEnvironmentStrings ( strValue, - strExpValue.GetWriteBuf(dwExpSize), + wxStringBuffer(strExpValue, dwExpSize), dwExpSize ) != 0; - strExpValue.UngetWriteBuf(); strValue = strExpValue; } @@ -878,6 +904,8 @@ bool wxRegKey::QueryValue(const wxChar *szValue, wxLogLastError(_T("ExpandEnvironmentStrings")); } } +#endif + // __WXWINCE__ } if ( m_dwLastError == ERROR_SUCCESS ) { @@ -1012,7 +1040,14 @@ bool wxRegKey::GetNextKey(wxString& strKeyName, long& lIndex) const return FALSE; wxChar szKeyName[_MAX_PATH + 1]; + +#ifdef __WXWINCE__ + DWORD sizeName = WXSIZEOF(szKeyName); + m_dwLastError = RegEnumKeyEx((HKEY) m_hKey, lIndex++, szKeyName, & sizeName, + 0, NULL, NULL, NULL); +#else m_dwLastError = RegEnumKey((HKEY) m_hKey, lIndex++, szKeyName, WXSIZEOF(szKeyName)); +#endif if ( m_dwLastError != ERROR_SUCCESS ) { if ( m_dwLastError == ERROR_NO_MORE_ITEMS ) { @@ -1052,16 +1087,25 @@ bool wxRegKey::IsNumericValue(const wxChar *szValue) const bool KeyExists(WXHKEY hRootKey, const wxChar *szKey) { - // don't close this key itself for the case of empty szKey! - if ( wxIsEmpty(szKey) ) - return TRUE; + // don't close this key itself for the case of empty szKey! + if ( wxIsEmpty(szKey) ) + return TRUE; + + HKEY hkeyDummy; + if ( ::RegOpenKeyEx + ( + (HKEY)hRootKey, + szKey, + RESERVED, + KEY_READ, // we might not have enough rights for rw access + &hkeyDummy + ) == ERROR_SUCCESS ) + { + ::RegCloseKey(hkeyDummy); + + return TRUE; + } - HKEY hkeyDummy; - if ( RegOpenKey( (HKEY) hRootKey, szKey, &hkeyDummy) == ERROR_SUCCESS ) { - RegCloseKey(hkeyDummy); - return TRUE; - } - else return FALSE; }