Index: base/reg_key.h |
diff --git a/base/reg_key.h b/base/reg_key.h |
deleted file mode 100644 |
index 295df98728ef79843509f81cd9e1cafa471e0685..0000000000000000000000000000000000000000 |
--- a/base/reg_key.h |
+++ /dev/null |
@@ -1,787 +0,0 @@ |
-// Copyright 2003-2009 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
-// |
-// reg_key.h |
-// |
-// Registry configuration wrappers class |
-// |
-// Offers static functions for convenient |
-// fast access for individual values |
-// |
-// Also provides a wrapper class for efficient |
-// batch operations on values of a given registry key. |
- |
-#ifndef OMAHA_BASE_REG_KEY_H_ |
-#define OMAHA_BASE_REG_KEY_H_ |
- |
-#include <windows.h> |
-#include <vector> |
-#include "base/basictypes.h" |
-#include "base/scoped_ptr.h" |
-#include "omaha/base/debug.h" |
-#include "omaha/base/logging.h" |
-#include "omaha/base/scoped_any.h" |
-#include "omaha/base/static_assert.h" |
-#include "omaha/base/store_watcher.h" |
- |
-namespace omaha { |
- |
-// maximum sizes registry key and value names |
-#define kMaxKeyNameChars (255 + 1) |
-#define kMaxValueNameChars (16383 + 1) |
- |
-class RegKey { |
- public: |
- RegKey(); |
- virtual ~RegKey(); |
- |
- // create a reg key |
- HRESULT Create(HKEY hKeyParent, const TCHAR * key_name, |
- TCHAR * reg_class = REG_NONE, DWORD options = REG_OPTION_NON_VOLATILE, |
- REGSAM sam_desired = KEY_ALL_ACCESS, |
- LPSECURITY_ATTRIBUTES lp_sec_attr = NULL, |
- LPDWORD lp_disposition = NULL); |
- |
- // create a reg key, given the full key name, including the HKEY root |
- // (say for example, "HKLM\\Software") |
- HRESULT Create(const TCHAR * full_key_name, |
- TCHAR * reg_class = REG_NONE, DWORD options = REG_OPTION_NON_VOLATILE, |
- REGSAM sam_desired = KEY_ALL_ACCESS, |
- LPSECURITY_ATTRIBUTES lp_sec_attr = NULL, |
- LPDWORD lp_disposition = NULL); |
- |
- // static helper function that create a set of reg keys, |
- // given an array of full key names including the HKEY root |
- // (say for example, "HKLM\\Software") |
- static HRESULT CreateKeys(const TCHAR* keys_to_create[], |
- DWORD number_of_keys, |
- TCHAR* reg_class = REG_NONE, |
- DWORD options = REG_OPTION_NON_VOLATILE, |
- LPSECURITY_ATTRIBUTES lp_sec_attr = NULL); |
- |
- // Static method to create a single key. |
- static HRESULT CreateKey(const TCHAR * full_key_name, |
- TCHAR * reg_class = REG_NONE, |
- DWORD options = REG_OPTION_NON_VOLATILE, |
- LPSECURITY_ATTRIBUTES lp_sec_attr = NULL); |
- |
- // open an existing reg key |
- HRESULT Open(HKEY hKeyParent, |
- const TCHAR * key_name, |
- REGSAM sam_desired = KEY_ALL_ACCESS); |
- |
- // open an existing reg key, given the full key name, including the HKEY root |
- // (say for example, "HKLM\\Software") |
- HRESULT Open(const TCHAR * full_key_name, |
- REGSAM sam_desired = KEY_ALL_ACCESS); |
- |
- // close this reg key |
- virtual HRESULT Close(); |
- |
- // check if the key has a specified value |
- bool HasValue(const TCHAR * value_name); |
- |
- // get the number of values for this key |
- uint32 GetValueCount(); |
- |
- // Called to get the value name for the given value name index |
- // Use GetValueCount() to get the total value_name count for this key |
- // Returns failure if no key at the specified index |
- // If you modify the key while enumerating, the indexes will be out of order. |
- // Since the index order is not guaranteed, you need to reset your counting |
- // loop. |
- // type refers to REG_DWORD, REG_QWORD, etc.. |
- // 'type' can be NULL if not interested in the value type |
- HRESULT GetValueNameAt(int index, CString * value_name, DWORD *type); |
- |
- // check if the current key has the specified subkey |
- bool HasSubkey(const TCHAR * key_name) const; |
- |
- // get the number of subkeys for this key |
- uint32 GetSubkeyCount(); |
- |
- // Called to get the key name for the given key index |
- // Use GetSubkeyCount() to get the total count for this key |
- // Returns failure if no key at the specified index |
- // If you modify the key while enumerating, the indexes will be out of order. |
- // Since the index order is not guaranteed, you need to reset your counting |
- // loop. |
- HRESULT GetSubkeyNameAt(int index, CString * key_name); |
- |
- // SETTERS |
- |
- // set an int32 value - use when reading multiple values from a key |
- HRESULT SetValue(const TCHAR * value_name, DWORD value) const; |
- |
- // set an int64 value |
- HRESULT SetValue(const TCHAR * value_name, DWORD64 value) const; |
- |
- // set a string value |
- HRESULT SetValue(const TCHAR * value_name, const TCHAR * value) const; |
- |
- // set binary data |
- HRESULT SetValue(const TCHAR * value_name, |
- const byte * value, |
- DWORD byte_count) const; |
- |
- // set raw data, including type |
- HRESULT SetValue(const TCHAR * value_name, |
- const byte * value, |
- DWORD byte_count, |
- DWORD type) const; |
- |
- // GETTERS |
- |
- // get type of a registry value |
- HRESULT GetValueType(const TCHAR* value_name, DWORD* value_type) const; |
- |
- // get an int32 value |
- HRESULT GetValue(const TCHAR * value_name, DWORD * value) const; |
- |
- // get an int64 value |
- // |
- // Note: if you are using time64 you should |
- // likely use GetLimitedTimeValue (util.h) instead of this method. |
- HRESULT GetValue(const TCHAR * value_name, DWORD64 * value) const; |
- |
- // get a string value - the caller must free the return buffer |
- HRESULT GetValue(const TCHAR * value_name, TCHAR * * value) const; |
- |
- // get a CString value |
- HRESULT GetValue(const TCHAR* value_name, OUT CString* value) const; |
- |
- // get a vector<CString> value from REG_MULTI_SZ type |
- HRESULT GetValue(const TCHAR * value_name, |
- std::vector<CString> * value) const; |
- |
- // get binary data - the caller must free the return buffer |
- HRESULT GetValue(const TCHAR * value_name, |
- byte * * value, |
- DWORD * byte_count) const; |
- |
- // get raw data, including type - the caller must free the return buffer |
- HRESULT GetValue(const TCHAR * value_name, |
- byte * * value, |
- DWORD * byte_count, |
- DWORD *type) const; |
- |
- // RENAMERS |
- |
- // Rename a named value. |
- HRESULT RenameValue(const TCHAR * old_value_name, |
- const TCHAR * new_value_name) const; |
- |
- // STATIC VERSIONS |
- |
- // flush |
- static HRESULT FlushKey(const TCHAR * full_key_name); |
- |
- // Check if a key exists. |
- static bool HasKey(const TCHAR * full_key_name); |
- |
- // Check if a key exists in the native (i.e. non-redirected) registry. |
- static bool HasNativeKey(const TCHAR * full_key_name); |
- |
- // check if the key has a specified value |
- static bool HasValue(const TCHAR * full_key_name, const TCHAR * value_name); |
- |
- // SETTERS |
- |
- // STATIC int32 set |
- static HRESULT SetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- DWORD value); |
- |
- // STATIC int64 set |
- static HRESULT SetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- DWORD64 value); |
- |
- // STATIC float set |
- static HRESULT SetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- float value); |
- |
- // STATIC double set |
- static HRESULT SetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- double value); |
- |
- // STATIC string set |
- static HRESULT SetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- const TCHAR * value); |
- |
- // STATIC binary data set |
- static HRESULT SetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- const byte * value, |
- DWORD byte_count); |
- |
- // STATIC array of strings set |
- static HRESULT SetValueMultiSZ(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- const byte * value, |
- DWORD byte_count); |
- |
- // STATIC expandable string set |
- static HRESULT SetValueExpandSZ(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- const TCHAR * value); |
- |
- // GETTERS |
- |
- // STATIC int32 get |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- DWORD * value); |
- |
- // STATIC int64 get |
- // |
- // Note: if you are using time64 you should |
- // likely use GetLimitedTimeValue (util.h) instead of this method. |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- DWORD64 * value); |
- |
- // STATIC float get |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- float * value); |
- |
- // STATIC double get |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- double * value); |
- |
- // STATIC string get (STR and CString versions) - the caller must free |
- // the return buffer |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- TCHAR * * value); |
- |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- CString * value); |
- |
- // STATIC REG_MULTI_SZ get |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- std::vector<CString> * value); |
- |
- // STATIC get binary data - the caller must free the return buffer |
- static HRESULT GetValue(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- byte * * value, |
- DWORD * byte_count); |
- |
- // Try reg keys successively if there is a failure in getting a value. |
- // |
- // Typically used when there is a user value and a default value if the |
- // user has none. |
- template<typename T> |
- static HRESULT GetValue(const TCHAR * full_key_names[], |
- int key_names_length, |
- const TCHAR * value_name, |
- T* value); |
- |
- // RENAMERS |
- |
- // Rename a named value. |
- static HRESULT RenameValue(const TCHAR * full_key_name, |
- const TCHAR * old_value_name, |
- const TCHAR * new_value_name); |
- |
- // COPIERS |
- |
- // The full_to_key must exist for CopyValue to succeed. |
- static HRESULT CopyValue(const TCHAR * full_from_key_name, |
- const TCHAR * from_value_name, |
- const TCHAR * full_to_key_name, |
- const TCHAR * to_value_name); |
- |
- static HRESULT CopyValue(const TCHAR * full_from_key_name, |
- const TCHAR * full_to_key_name, |
- const TCHAR * value_name); |
- |
- // Get type of a registry value |
- static HRESULT GetValueType(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- DWORD* value_type); |
- |
- // delete a subkey of the current key (with no subkeys) |
- HRESULT DeleteSubKey(const TCHAR * key_name); |
- |
- // recursively delete a sub key of the current key (and all its subkeys) |
- HRESULT RecurseDeleteSubKey(const TCHAR * key_name); |
- |
- // STATIC version of delete key - handles nested keys also |
- // delete a key and all its sub-keys recursively |
- // Returns S_FALSE if key didn't exist, S_OK if deletion was successful, |
- // and failure otherwise. |
- static HRESULT DeleteKey(const TCHAR* full_key_name); |
- |
- // STATIC version of delete key |
- // delete a key recursively or non-recursively |
- // Returns S_FALSE if key didn't exist, S_OK if deletion was successful, |
- // and failure otherwise. |
- static HRESULT DeleteKey(const TCHAR* full_key_name, bool recursive); |
- |
- // delete the specified value |
- HRESULT DeleteValue(const TCHAR * value_name) const; |
- |
- // STATIC version of delete value |
- // Returns S_FALSE if key didn't exist, S_OK if deletion was successful, |
- // and failure otherwise. |
- static HRESULT DeleteValue(const TCHAR * full_key_name, |
- const TCHAR * value_name); |
- |
- // Peek inside (use a RegKey as a smart wrapper around a registry handle) |
- HKEY Key() { return h_key_; } |
- |
- // Used to help test the private functionality |
- friend class RegKeyTestClass; |
- |
- // helper function to get the HKEY and the root key from a string |
- // representation modifies the argument in place and returns the key name |
- // e.g. HKLM\\Software\\Google\... returns HKLM, "Software\\Google\..." |
- // Necessary for the static versions that use the full name of the reg key |
- static HKEY GetRootKeyInfo(CString * full_key_name); |
- |
- // Returns true if this key name is 'safe' for deletion (doesn't specify |
- // a key root) |
- static bool SafeKeyNameForDeletion(const wchar_t *key_name); |
- |
- // save the key and all of its subkeys and values to a file |
- static HRESULT Save(const TCHAR* full_key_name, const TCHAR* file_name); |
- |
- // restore the key and all of its subkeys and values which are saved into |
- // a file |
- static HRESULT Restore(const TCHAR* full_key_name, const TCHAR* file_name); |
- |
- // Is the key empty: having no sub-keys and values |
- static bool IsKeyEmpty(const TCHAR* full_key_name); |
- |
- private: |
- |
- // Helper function to check if a key exists, using the sam flags specified. |
- // Note: KEY_READ must be included in sam_flags. |
- static bool HasKeyHelper(const TCHAR * full_key_name, DWORD sam_flags); |
- |
- // helper function to get the parent key name and the subkey from a string |
- // representation modifies the argument in place and returns the key name |
- // e.g. Software\\Google\\Foo_Bar returns "Software\\Google", "Foo_Bar" |
- // Necessary for the static versions that use the full name of the reg key |
- static CString GetParentKeyInfo(CString * key_name); |
- |
- // helper function to get any value from the registry |
- // used when the size of the data is unknown |
- HRESULT GetValueHelper(const TCHAR * value_name, |
- DWORD * type, |
- byte * * value, |
- DWORD * byte_count) const; |
- |
- // common SET Helper for the static case |
- static HRESULT SetValueStaticHelper(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- DWORD type, |
- LPVOID value, |
- DWORD byte_count = 0); |
- |
- // common GET Helper for the static case |
- static HRESULT GetValueStaticHelper(const TCHAR * full_key_name, |
- const TCHAR * value_name, |
- DWORD type, |
- LPVOID value, |
- DWORD * byte_count = NULL); |
- |
- // convert REG_MULTI_SZ bytes to string array |
- static HRESULT MultiSZBytesToStringArray(const byte * buffer, |
- DWORD byte_count, |
- std::vector<CString> * value); |
- |
- // set a string or expandable string value |
- HRESULT SetStringValue(const TCHAR * value_name, |
- const TCHAR * value, |
- DWORD type) const; |
- |
- // the HKEY for the current key |
- HKEY h_key_; |
- |
- DISALLOW_EVIL_CONSTRUCTORS(RegKey); |
-}; |
- |
-// Provides all the functionality of RegKey plus |
-// an event to watch for changes to the registry key. |
-class RegKeyWithChangeEvent : public RegKey { |
- public: |
- RegKeyWithChangeEvent() {} |
- // close this reg key and the event |
- virtual HRESULT Close(); |
- |
- // Called to create/reset the event that gets signaled |
- // any time the registry key changes. Access the created |
- // event using change_event(). |
- // |
- // See the documentation for RegNotifyChangeKeyValue |
- // for values for notify_filter. |
- HRESULT SetupEvent(bool watch_subtree, DWORD notify_filter); |
- |
- // Indicates if any changes (that are being monitored) have occured |
- bool HasChangeOccurred() const; |
- |
- // Get the event that is signaled on registry changes. |
- // Note: |
- // * This event will remain constant until Close() is called. |
- // * One should call SetupEvent to set-up the event. |
- // * The event is only signaled on the next change and remains signaled. |
- // Do not call ::ResetEvent(). Call SetupEvent() to reset |
- // the event and wait for more changes. |
- HANDLE change_event() const { |
- return get(change_event_); |
- } |
- |
- private: |
- scoped_handle change_event_; |
- DISALLOW_EVIL_CONSTRUCTORS(RegKeyWithChangeEvent); |
-}; |
- |
-// Does the common things necessary for watching |
-// registry key changes. If there are file change or other watchers, |
-// there could be a common interface for the three methods to decouple |
-// the code that is doing the watching from the code that owns the store. |
-class RegKeyWatcher : public StoreWatcher { |
- public: |
- // reg_key: the full string for the reg key |
- // watch_subtree: watch all subkey changes or |
- // only immediate child values |
- // notify_filter: See the documentation for RegNotifyChangeKeyValue |
- // allow_creation: Should the key be created if it doesn't exist? |
- RegKeyWatcher(const TCHAR* reg_key, bool watch_subtree, |
- DWORD notify_filter, bool allow_creation); |
- virtual ~RegKeyWatcher() {} |
- |
- // Called to create/reset the event that gets signaled |
- // any time the registry key changes. Access the created |
- // event using change_event(). |
- virtual HRESULT EnsureEventSetup(); |
- |
- // Get the event that is signaled on registry changes. |
- virtual HANDLE change_event() const; |
- |
- private: |
- // Used to do the SetupEvent method |
- scoped_ptr<RegKeyWithChangeEvent> reg_key_with_change_event_; |
- |
- CString reg_key_string_; |
- bool watch_subtree_; |
- bool allow_creation_; |
- DWORD notify_filter_; |
- DISALLOW_EVIL_CONSTRUCTORS(RegKeyWatcher); |
-}; |
- |
- |
-inline RegKey::RegKey() { h_key_ = NULL; } |
- |
-inline RegKey::~RegKey() { Close(); } |
- |
-inline bool RegKey::HasValue(const TCHAR* value_name) { |
- return (ERROR_SUCCESS == ::RegQueryValueEx(h_key_, |
- value_name, |
- NULL, NULL, |
- NULL, |
- NULL)); |
-} |
- |
-// SETTERS static versions |
-inline HRESULT RegKey::SetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- DWORD value) { |
- ASSERT1(full_key_name); |
- |
- return SetValueStaticHelper(full_key_name, value_name, REG_DWORD, &value); |
-} |
- |
-inline HRESULT RegKey::SetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- DWORD64 value) { |
- ASSERT1(full_key_name); |
- |
- return SetValueStaticHelper(full_key_name, value_name, REG_QWORD, &value); |
-} |
- |
-inline HRESULT RegKey::SetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- float value) { |
- ASSERT1(full_key_name); |
- |
- return SetValueStaticHelper(full_key_name, |
- value_name, |
- REG_BINARY, |
- &value, |
- sizeof(value)); |
-} |
- |
-inline HRESULT RegKey::SetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- double value) { |
- ASSERT1(full_key_name); |
- |
- return SetValueStaticHelper(full_key_name, |
- value_name, |
- REG_BINARY, |
- &value, |
- sizeof(value)); |
-} |
- |
-inline HRESULT RegKey::SetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- const TCHAR* value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- return SetValueStaticHelper(full_key_name, |
- value_name, |
- REG_SZ, |
- const_cast<TCHAR*>(value)); |
-} |
- |
-inline HRESULT RegKey::SetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- const byte* value, |
- DWORD byte_count) { |
- ASSERT1(full_key_name); |
- |
- return SetValueStaticHelper(full_key_name, value_name, REG_BINARY, |
- const_cast<byte*>(value), byte_count); |
-} |
- |
-inline HRESULT RegKey::SetValueMultiSZ(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- const byte* value, |
- DWORD byte_count) { |
- ASSERT1(full_key_name); |
- |
- return SetValueStaticHelper(full_key_name, value_name, REG_MULTI_SZ, |
- const_cast<byte*>(value), byte_count); |
-} |
- |
-inline HRESULT RegKey::SetValueExpandSZ(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- const TCHAR* value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- return SetValueStaticHelper(full_key_name, |
- value_name, |
- REG_EXPAND_SZ, |
- const_cast<TCHAR*>(value)); |
-} |
- |
-// GETTERS static versions |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- DWORD* value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- return GetValueStaticHelper(full_key_name, value_name, REG_DWORD, value); |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- DWORD64* value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- return GetValueStaticHelper(full_key_name, value_name, REG_QWORD, value); |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- float* value) { |
- ASSERT1(value); |
- ASSERT1(value_name); |
- ASSERT1(full_key_name); |
- |
- DWORD byte_count = 0; |
- byte* buffer = NULL; |
- HRESULT hr = GetValueStaticHelper(full_key_name, |
- value_name, |
- REG_BINARY, |
- &buffer, |
- &byte_count); |
- scoped_array<byte> free_buffer(buffer); |
- |
- if (SUCCEEDED(hr)) { |
- if (byte_count == sizeof(*value)) { |
- ::CopyMemory(value, buffer, sizeof(*value)); |
- } else { |
- UTIL_LOG(LEVEL_ERROR, (_T("[RegKey::GetValue]") |
- _T("[size mismatches for float value][%s\\%s]"), |
- full_key_name, value_name)); |
- return HRESULT_FROM_WIN32(ERROR_DATATYPE_MISMATCH); |
- } |
- } |
- |
- return hr; |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- double* value) { |
- ASSERT1(value); |
- ASSERT1(value_name); |
- ASSERT1(full_key_name); |
- |
- DWORD byte_count = 0; |
- byte* buffer = NULL; |
- HRESULT hr = GetValueStaticHelper(full_key_name, |
- value_name, |
- REG_BINARY, |
- &buffer, |
- &byte_count); |
- scoped_array<byte> free_buffer(buffer); |
- |
- if (SUCCEEDED(hr)) { |
- if (byte_count == sizeof(*value)) { |
- ::CopyMemory(value, buffer, sizeof(*value)); |
- } else { |
- UTIL_LOG(LEVEL_ERROR, (_T("[RegKey::GetValue]") |
- _T("[size mismatches for double value][%s\\%s]"), |
- full_key_name, value_name)); |
- return HRESULT_FROM_WIN32(ERROR_DATATYPE_MISMATCH); |
- } |
- } |
- |
- return hr; |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- TCHAR** value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- return GetValueStaticHelper(full_key_name, value_name, REG_SZ, value); |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- CString* value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- TCHAR* buffer = NULL; |
- HRESULT hr = RegKey::GetValue(full_key_name, value_name, &buffer); |
- value->SetString(buffer); |
- delete [] buffer; |
- return hr; |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- std::vector<CString>* value) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- |
- return GetValueStaticHelper(full_key_name, value_name, REG_MULTI_SZ, value); |
-} |
- |
-inline HRESULT RegKey::GetValue(const TCHAR* full_key_name, |
- const TCHAR* value_name, |
- byte** value, |
- DWORD* byte_count) { |
- ASSERT1(full_key_name); |
- ASSERT1(value); |
- ASSERT1(byte_count); |
- |
- return GetValueStaticHelper(full_key_name, |
- value_name, |
- REG_BINARY, |
- value, |
- byte_count); |
-} |
- |
-template<typename T> |
-HRESULT RegKey::GetValue(const TCHAR* full_key_names[], |
- int key_names_length, |
- const TCHAR* value_name, |
- T* value) { |
- HRESULT hr = S_OK; |
- for (int i = 0; i < key_names_length; ++i) { |
- hr = GetValue(full_key_names[i], value_name, value); |
- if (SUCCEEDED(hr)) { |
- return hr; |
- } |
- } |
- return hr; |
-} |
- |
-// Rename a named value. |
-inline HRESULT RegKey::RenameValue(const TCHAR * full_key_name, |
- const TCHAR * old_value_name, |
- const TCHAR * new_value_name) { |
- ASSERT1(full_key_name); |
- |
- RegKey reg_key; |
- HRESULT hr = reg_key.Open(full_key_name); |
- if (FAILED(hr)) { |
- return hr; |
- } |
- |
- return reg_key.RenameValue(old_value_name, new_value_name); |
-} |
- |
-inline HRESULT RegKey::CopyValue(const TCHAR * full_from_key_name, |
- const TCHAR * full_to_key_name, |
- const TCHAR * value_name) { |
- return CopyValue(full_from_key_name, |
- value_name, |
- full_to_key_name, |
- value_name); |
-} |
- |
-// DELETE |
-inline HRESULT RegKey::DeleteSubKey(const TCHAR* key_name) { |
- ASSERT1(key_name); |
- ASSERT1(h_key_); |
- |
- LONG res = ::RegDeleteKey(h_key_, key_name); |
- HRESULT hr = HRESULT_FROM_WIN32(res); |
- if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || |
- hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)) { |
- hr = S_FALSE; |
- } |
- return hr; |
-} |
- |
-inline HRESULT RegKey::DeleteValue(const TCHAR* value_name) const { |
- ASSERT1(value_name); |
- ASSERT1(h_key_); |
- |
- LONG res = ::RegDeleteValue(h_key_, value_name); |
- HRESULT hr = HRESULT_FROM_WIN32(res); |
- if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || |
- hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)) { |
- hr = S_FALSE; |
- } |
- return hr; |
-} |
- |
-} // namespace omaha |
- |
-#endif // OMAHA_BASE_REG_KEY_H_ |
- |