/*++ Copyright (c) 1994-1998 Microsoft Corporation Module Name : registry.h Abstract: Registry classes definitions Author: Ronald Meijer (ronaldm) Project: Internet Services Manager Revision History: --*/ #ifndef _REGISTRY_H #define _REGISTRY_H // // Forward declarations // class CRMCRegKey; class CRMCRegValueIter; class CRMCRegKeyIter; // // Maximum size of a Registry class name // #define CREGKEY_MAX_CLASS_NAME MAX_PATH // // Parameter helper // #define EXPANSION_ON (TRUE) #define EXPANSION_OFF (FALSE) class COMDLL CRMCRegKey : public CObject /*++ Class Description: Registry key class. Public Interface: CRMCRegKey : Registry key object constructor ~CRMCRegKey : Registry key object destructor operator HKEY : cast to HKEY handle GetHandle : Get HKEY handle Ok : TRUE if the key was initialized OK, FALSE otherwise. IsLocal : TRUE if the key was opened on the local machine QueryKeyInfo : Fill a key information structure QueryValue : Overloaded value query members SetValue : Overloaded set value members AssertValid : Assert the object is in a valid state (debug only) Dump : Dump to the debug context (debug only) --*/ { public: // // Key information return structure // typedef struct { TCHAR chBuff[CREGKEY_MAX_CLASS_NAME]; DWORD dwClassNameSize, dwNumSubKeys, dwMaxSubKey, dwMaxClass, dwMaxValues, dwMaxValueName, dwMaxValueData, dwSecDesc; FILETIME ftKey; } CREGKEY_KEY_INFO; // // Constructor/Destructor // public: // // Standard constructor for an existing key // CRMCRegKey( IN HKEY hKeyBase, IN LPCTSTR lpszSubKey = NULL, IN REGSAM regSam = KEY_ALL_ACCESS, IN LPCTSTR lpszServerName = NULL ); // // Constructor creating a new key. // CRMCRegKey( OUT BOOL * pfNewKeyCreated, IN HKEY hKeyBase, IN LPCTSTR lpszSubKey = NULL, IN DWORD dwOptions = REG_OPTION_NON_VOLATILE, IN REGSAM regSam = KEY_ALL_ACCESS, IN LPSECURITY_ATTRIBUTES pSecAttr = NULL, IN LPCTSTR lpszServerName = NULL ); ~CRMCRegKey(); // // Interface // public: // // Allow a CRMCRegKey to be used anywhere an HKEY is required. // operator HKEY() const; HKEY GetHandle() const; BOOL Ok() const; BOOL IsLocal() const; // // Fill a key information structure // DWORD QueryKeyInfo( OUT CREGKEY_KEY_INFO * pRegKeyInfo ); // // Overloaded value query members; each returns ERROR_INVALID_PARAMETER // if data exists but not in correct form to deliver into result object. // public: // // Autoexpand will automatically expand REG_EXPAND_SZ items on the // local computer. // DWORD QueryValue( IN LPCTSTR lpszValueName, OUT CString & strResult, IN BOOL fAutoExpand = EXPANSION_OFF, OUT BOOL * pfExpanded = NULL ); DWORD QueryValue( IN LPCTSTR lpszValueName, OUT CStringListEx & strList ); DWORD QueryValue( IN LPCTSTR lpszValueName, OUT DWORD & dwResult ); DWORD QueryValue( IN LPCTSTR lpszValueName, OUT CByteArray & abResult ); DWORD QueryValue( IN LPCTSTR lpszValueName, OUT void * pvResult, OUT DWORD cbSize ); // // Overloaded value setting members. // public: // // AutoDeflate will attempt to use %SystemRoot% in the path // and write it as REG_EXPAND_SZ. if *pfDeflate = TRUE // upon entry, REG_EXPAND_SZ will be set as well, but // not automatic environment substitution will be performed. // // Otherwise, this will set as REG_SZ. // DWORD SetValue( IN LPCTSTR lpszValueName, IN CString & strResult, IN BOOL fAutoDeflate = EXPANSION_OFF, OUT BOOL * pfDeflate = NULL ); DWORD SetValue( IN LPCTSTR lpszValueName, IN CStringListEx & strList ); DWORD SetValue( IN LPCTSTR lpszValueName, IN DWORD & dwResult ); DWORD SetValue( IN LPCTSTR lpszValueName, IN CByteArray & abResult ); DWORD SetValue( IN LPCTSTR lpszValueName, IN void * pvResult, IN DWORD cbSize ); // // Delete Key/Value // public: DWORD DeleteValue(LPCTSTR lpszValueName); DWORD DeleteKey(LPCTSTR lpszSubKey); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump( IN OUT CDumpContext& dc ) const; #endif // _DEBUG protected: // // Convert a CStringListEx to the REG_MULTI_SZ format // static DWORD FlattenValue( IN CStringListEx & strList, OUT DWORD * pcbSize, OUT BYTE ** ppbData ); // // Convert a CByteArray to a REG_BINARY block // static DWORD FlattenValue( IN CByteArray & abData, OUT DWORD * pcbSize, OUT BYTE ** ppbData ); protected: // // Prepare to read a value by finding the value's size. // DWORD PrepareValue( LPCTSTR lpszValueName, DWORD * pdwType, DWORD * pcbSize, BYTE ** ppbData ); private: BOOL m_fLocal; HKEY m_hKey; DWORD m_dwDisposition; }; class COMDLL CRMCRegValueIter : public CObject /*++ Class Description: Registry value iteration class Public Interface: CRMCRegValueIter : Iteration class constructor ~CRMCRegValueIter : Iteration class destructor Next : Get the name of the next key Reset : Reset the iterator --*/ { // // Constructor/Destructor // public: CRMCRegValueIter( IN CRMCRegKey & regKey ); ~CRMCRegValueIter(); // // Interface // public: // // Get the name (and optional last write time) of the next key. // DWORD Next( OUT CString * pstrName, OUT DWORD * pdwType ); // // Reset the iterator // void Reset(); protected: CRMCRegKey & m_rkIter; DWORD m_dwIndex; TCHAR * m_pBuffer; DWORD m_cbBuffer; }; class COMDLL CRMCRegKeyIter : public CObject /*++ Class Description: Iterate the sub-key names of a key Public Interface: CRMCRegKeyIter : Iteration class constructor ~CRMCRegKeyIter : Iteration class destructor Next : Get the name of the next key Reset : Reset the iterator --*/ { public: CRMCRegKeyIter( IN CRMCRegKey & regKey ); ~CRMCRegKeyIter(); // // Interface // public: // // Get the name (and optional last write time) of the next key. // DWORD Next( OUT CString * pstrName, OUT CTime * pTime = NULL ); // // Reset the iterator // void Reset(); private: CRMCRegKey & m_rkIter; DWORD m_dwIndex; TCHAR * m_pBuffer; DWORD m_cbBuffer; }; // // Inline Expansion // // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< inline CRMCRegKey::operator HKEY() const { return m_hKey; } inline HKEY CRMCRegKey::GetHandle() const { return m_hKey; } inline BOOL CRMCRegKey::Ok() const { return m_hKey != NULL; } inline BOOL CRMCRegKey::IsLocal() const { return m_fLocal; } inline DWORD CRMCRegKey::DeleteValue( IN LPCTSTR lpszValueName ) { return ::RegDeleteValue(*this, lpszValueName); } inline DWORD CRMCRegKey::DeleteKey( IN LPCTSTR lpszSubKey ) { return ::RegDeleteKey(*this, lpszSubKey); } inline void CRMCRegValueIter::Reset() { m_dwIndex = 0L; } inline void CRMCRegKeyIter::Reset() { m_dwIndex = 0L; } #endif // _REGISTRY_H