OSDN Git Service

Registry functions: Optionally allow caller to force 32-bit registry view or 64-bit...
authorLoRd_MuldeR <mulder2@gmx.de>
Fri, 11 Mar 2016 18:11:18 +0000 (19:11 +0100)
committerLoRd_MuldeR <mulder2@gmx.de>
Fri, 11 Mar 2016 18:11:18 +0000 (19:11 +0100)
include/MUtils/Registry.h
src/Registry_Win32.cpp

index 2adcf79..c38cdba 100644 (file)
@@ -49,6 +49,15 @@ namespace MUtils
                }
                reg_access_t;
 
+               //Regsitry scope
+               typedef enum
+               {
+                       scope_default = 0,
+                       scope_wow_x32 = 1,
+                       scope_wow_x64 = 2
+               }
+               reg_scope_t;
+
                //Forward declaration
                namespace Internal
                {
@@ -59,7 +68,7 @@ namespace MUtils
                class MUTILS_API RegistryKey
                {
                public:
-                       RegistryKey(const reg_root_t &rootKey, const QString &keyName, const reg_access_t &access);
+                       RegistryKey(const reg_root_t &rootKey, const QString &keyName, const reg_access_t &access, const reg_scope_t &scope = scope_default);
                        ~RegistryKey(void);
 
                        inline bool isOpen(void);
@@ -78,14 +87,14 @@ namespace MUtils
                };
 
                //Regsitry functions
-               MUTILS_API bool reg_value_write (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const quint32 &value);
-               MUTILS_API bool reg_value_write (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const QString &value);
-               MUTILS_API bool reg_value_read  (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, quint32       &value);
-               MUTILS_API bool reg_value_read  (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, QString       &value);
-               MUTILS_API bool reg_key_exists  (const reg_root_t &rootKey, const QString &keyName);
-               MUTILS_API bool reg_key_delete  (const reg_root_t &rootKey, const QString &keyName, const bool &recusrive = true, const bool &ascend = false);
-               MUTILS_API bool reg_enum_values (const reg_root_t &rootKey, const QString &keyName, QStringList &list);
-               MUTILS_API bool reg_enum_subkeys(const reg_root_t &rootKey, const QString &keyName, QStringList &list);
+               MUTILS_API bool reg_value_write (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const quint32 &value,           const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_value_write (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const QString &value,           const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_value_read  (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, quint32       &value,           const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_value_read  (const reg_root_t &rootKey, const QString &keyName, const QString &valueName, QString       &value,           const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_key_exists  (const reg_root_t &rootKey, const QString &keyName,                                                           const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_key_delete  (const reg_root_t &rootKey, const QString &keyName, const bool &recusrive = true, const bool &ascend = false, const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_enum_values (const reg_root_t &rootKey, const QString &keyName, QStringList &list,                                        const reg_scope_t &scope = scope_default);
+               MUTILS_API bool reg_enum_subkeys(const reg_root_t &rootKey, const QString &keyName, QStringList &list,                                        const reg_scope_t &scope = scope_default);
        }
 }
 
index de67ef0..39c60ab 100644 (file)
@@ -71,6 +71,17 @@ namespace MUtils
                        }
                }
 
+               static DWORD registry_scope(const reg_scope_t &scope)
+               {
+                       switch (scope)
+                       {
+                               case scope_default: return 0;               break;
+                               case scope_wow_x32: return KEY_WOW64_32KEY; break;
+                               case scope_wow_x64: return KEY_WOW64_64KEY; break;
+                               default: MUTILS_THROW("Unknown scope value was specified!");
+                       }
+               }
+
                static const char* reg_root2str(const reg_root_t &rootKey)
                {
                        ENUM2STR(rootKey, root_classes);
@@ -134,12 +145,12 @@ while(0)
 // Registry Key Class
 ///////////////////////////////////////////////////////////////////////////////
 
-MUtils::Registry::RegistryKey::RegistryKey(const reg_root_t &rootKey, const QString &keyName, const reg_access_t &access)
+MUtils::Registry::RegistryKey::RegistryKey(const reg_root_t &rootKey, const QString &keyName, const reg_access_t &access, const reg_scope_t &scope)
 :
        p(new Internal::RegistryKeyPrivate())
 {
        p->m_hKey   = NULL;
-       p->m_access = registry_access(access);
+       p->m_access = registry_access(access) | registry_scope(scope);
        p->m_isOpen = false;
 
        p->m_isOpen = (RegCreateKeyEx(registry_root(rootKey), MUTILS_WCHR(keyName), 0, NULL, 0, p->m_access, NULL, &p->m_hKey, NULL) == ERROR_SUCCESS);
@@ -243,10 +254,10 @@ bool MUtils::Registry::RegistryKey::enum_subkeys(QStringList &list) const
 /*
  * Write registry value
  */
-bool MUtils::Registry::reg_value_write(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const quint32 &value)
+bool MUtils::Registry::reg_value_write(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const quint32 &value, const reg_scope_t &scope)
 {
        bool success = false;
-       RegistryKey regKey(rootKey, keyName, access_readwrite);
+       RegistryKey regKey(rootKey, keyName, access_readwrite, scope);
        if(regKey.isOpen())
        {
                success = regKey.value_write(valueName, value);
@@ -257,10 +268,10 @@ bool MUtils::Registry::reg_value_write(const reg_root_t &rootKey, const QString
 /*
  * Write registry value
  */
-bool MUtils::Registry::reg_value_write(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const QString &value)
+bool MUtils::Registry::reg_value_write(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, const QString &value, const reg_scope_t &scope)
 {
        bool success = false;
-       RegistryKey regKey(rootKey, keyName, access_readwrite);
+       RegistryKey regKey(rootKey, keyName, access_readwrite, scope);
        if(regKey.isOpen())
        {
                success = regKey.value_write(valueName, value);
@@ -271,10 +282,10 @@ bool MUtils::Registry::reg_value_write(const reg_root_t &rootKey, const QString
 /*
  * Read registry value
  */
-bool MUtils::Registry::reg_value_read(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, quint32 &value)
+bool MUtils::Registry::reg_value_read(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, quint32 &value, const reg_scope_t &scope)
 {
        bool success = false;
-       RegistryKey regKey(rootKey, keyName, access_readonly);
+       RegistryKey regKey(rootKey, keyName, access_readonly, scope);
        if(regKey.isOpen())
        {
                success = regKey.value_read(valueName, value);
@@ -289,10 +300,10 @@ bool MUtils::Registry::reg_value_read(const reg_root_t &rootKey, const QString &
 /*
  * Read registry value
  */
-bool MUtils::Registry::reg_value_read(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, QString &value)
+bool MUtils::Registry::reg_value_read(const reg_root_t &rootKey, const QString &keyName, const QString &valueName, QString &value, const reg_scope_t &scope)
 {
        bool success = false;
-       RegistryKey regKey(rootKey, keyName, access_readonly);
+       RegistryKey regKey(rootKey, keyName, access_readonly, scope);
        if(regKey.isOpen())
        {
                success = regKey.value_read(valueName, value);
@@ -307,10 +318,10 @@ bool MUtils::Registry::reg_value_read(const reg_root_t &rootKey, const QString &
 /*
  * Enumerate value names
  */
-bool MUtils::Registry::reg_enum_values(const reg_root_t &rootKey, const QString &keyName, QStringList &values)
+bool MUtils::Registry::reg_enum_values(const reg_root_t &rootKey, const QString &keyName, QStringList &values, const reg_scope_t &scope)
 {
        bool success = false;
-       RegistryKey regKey(rootKey, keyName, access_readonly);
+       RegistryKey regKey(rootKey, keyName, access_readonly, scope);
        if(regKey.isOpen())
        {
                success = regKey.enum_values(values);
@@ -325,10 +336,10 @@ bool MUtils::Registry::reg_enum_values(const reg_root_t &rootKey, const QString
 /*
  * Enumerate subkey names
  */
-bool MUtils::Registry::reg_enum_subkeys(const reg_root_t &rootKey, const QString &keyName, QStringList &subkeys)
+bool MUtils::Registry::reg_enum_subkeys(const reg_root_t &rootKey, const QString &keyName, QStringList &subkeys, const reg_scope_t &scope)
 {
        bool success = false;
-       RegistryKey regKey(rootKey, keyName, access_enumerate);
+       RegistryKey regKey(rootKey, keyName, access_enumerate, scope);
        if(regKey.isOpen())
        {
                success = regKey.enum_subkeys(subkeys);
@@ -343,10 +354,10 @@ bool MUtils::Registry::reg_enum_subkeys(const reg_root_t &rootKey, const QString
 /*
  * Check registry key existence
  */
-bool MUtils::Registry::reg_key_exists(const reg_root_t &rootKey, const QString &keyName)
+bool MUtils::Registry::reg_key_exists(const reg_root_t &rootKey, const QString &keyName, const reg_scope_t &scope)
 {
        HKEY hKey = NULL;
-       if(RegOpenKeyEx(registry_root(rootKey), MUTILS_WCHR(keyName), 0, STANDARD_RIGHTS_READ, &hKey) == ERROR_SUCCESS)
+       if(RegOpenKeyEx(registry_root(rootKey), MUTILS_WCHR(keyName), 0, STANDARD_RIGHTS_READ | registry_scope(scope), &hKey) == ERROR_SUCCESS)
        {
                RegCloseKey(hKey);
                return true;
@@ -357,10 +368,15 @@ bool MUtils::Registry::reg_key_exists(const reg_root_t &rootKey, const QString &
 /*
  * Delete registry key
  */
-bool MUtils::Registry::reg_key_delete(const reg_root_t &rootKey, const QString &keyName, const bool &recusrive, const bool &ascend)
+bool MUtils::Registry::reg_key_delete(const reg_root_t &rootKey, const QString &keyName, const bool &recusrive, const bool &ascend, const reg_scope_t &scope)
 {
        bool okay = false;
 
+       if (scope != scope_default)
+       {
+               MUTILS_THROW("Scope option not currently supported by reg_key_delete() function!");
+       }
+
        if(recusrive)
        {
                okay = (SHDeleteKey(registry_root(rootKey), MUTILS_WCHR(keyName)) == ERROR_SUCCESS);