252 lines
6.4 KiB
C++
252 lines
6.4 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
regkey.h
|
|
|
|
FILE HISTORY:
|
|
|
|
*/
|
|
|
|
#ifndef _TREGKEY_H
|
|
#define _TREGKEY_H
|
|
|
|
#if _MSC_VER >= 1000 // VC 5.0 or later
|
|
#pragma once
|
|
#endif
|
|
|
|
/*---------------------------------------------------------------------------
|
|
String length functions
|
|
---------------------------------------------------------------------------*/
|
|
|
|
#define StrLen lstrlen
|
|
#define StrLenA lstrlenA
|
|
#define StrLenW lstrlenW
|
|
#define StrLenOle StrLenW
|
|
|
|
//
|
|
// CbStrLenA() is inaccurate for DBCS strings! It will return the
|
|
// incorrect number of bytes needed.
|
|
//
|
|
|
|
#define CbStrLenA(psz) ((StrLenA(psz)+1)*sizeof(char))
|
|
#define CbStrLenW(psz) ((StrLenW(psz)+1)*sizeof(WCHAR))
|
|
|
|
#ifdef _UNICODE
|
|
#define CbStrLen(psz) CbStrLenW(psz)
|
|
#else
|
|
#define CbStrLen(psz) CbStrLenA(psz)
|
|
#endif
|
|
|
|
|
|
//
|
|
// Maximum size of a Registry class name
|
|
//
|
|
#define CREGKEY_MAX_CLASS_NAME MAX_PATH
|
|
|
|
#ifndef MaxCchFromCb
|
|
// Given a cb (count of bytes) this is the maximal number of characters
|
|
// that can be in this string
|
|
#define MaxCchFromCb(cb) ((cb) / sizeof(TCHAR))
|
|
#endif
|
|
|
|
#ifndef MinTCharNeededForCch
|
|
// that needs to be allocated to hold the string
|
|
#define MinTCharNeededForCch(ch) ((ch) * (2/sizeof(TCHAR)))
|
|
#endif
|
|
|
|
#ifndef MinCbNeededForCch
|
|
#define MinCbNeededForCch(ch) (sizeof(TCHAR)*MinTCharNeededForCch(ch))
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef TFS_EXPORT_CLASS
|
|
#define TFS_EXPORT_CLASS
|
|
#endif
|
|
|
|
// Convert a CStringList to the REG_MULTI_SZ format
|
|
DWORD StrList2MULTI_SZ(CStringList & strList, DWORD * pcbSize, BYTE ** ppbData);
|
|
|
|
// Convert a REG_MULTI_SZ format to the CStringList
|
|
DWORD MULTI_SZ2StrList(LPCTSTR pbMulti_Sz, CStringList & strList);
|
|
|
|
//
|
|
// Wrapper for a Registry key handle.
|
|
//
|
|
class TFS_EXPORT_CLASS RegKey
|
|
{
|
|
|
|
public:
|
|
//
|
|
// Key information return structure
|
|
//
|
|
typedef struct
|
|
{
|
|
TCHAR chBuff [CREGKEY_MAX_CLASS_NAME] ;
|
|
DWORD dwClassNameSize, // size of the class string
|
|
dwNumSubKeys, // number of subkeys
|
|
dwMaxSubKey, // longest subkey name length
|
|
dwMaxClass, // longest class string length
|
|
dwMaxValues, // number of value entries
|
|
dwMaxValueName, // longest value name length
|
|
dwMaxValueData, // longest value data length
|
|
dwSecDesc ; // security descriptor length
|
|
FILETIME ftKey ;
|
|
} CREGKEY_KEY_INFO ;
|
|
|
|
// Standard constructor
|
|
// To get at keys, you will have to open/create the key
|
|
RegKey();
|
|
~RegKey ();
|
|
|
|
DWORD Create(HKEY hKeyParent,
|
|
LPCTSTR lpszKeyName,
|
|
DWORD dwOptions = REG_OPTION_NON_VOLATILE,
|
|
REGSAM samDesired = KEY_ALL_ACCESS,
|
|
LPSECURITY_ATTRIBUTES lpSecAttr = NULL,
|
|
LPCTSTR pszServerName = NULL);
|
|
|
|
DWORD Open(HKEY hKeyParent,
|
|
LPCTSTR pszSubKey,
|
|
REGSAM samDesired = KEY_ALL_ACCESS,
|
|
LPCTSTR pszServerName = NULL);
|
|
DWORD Close();
|
|
HKEY Detach();
|
|
void Attach(HKEY hKey);
|
|
DWORD DeleteSubKey(LPCTSTR lpszSubKey);
|
|
DWORD RecurseDeleteKey(LPCTSTR lpszKey);
|
|
DWORD DeleteValue(LPCTSTR lpszValue);
|
|
|
|
// Deletes the subkeys of the current key (does NOT delete the
|
|
// current key).
|
|
DWORD RecurseDeleteSubKeys();
|
|
//
|
|
// Allow a RegKey to be used anywhere an HKEY is required.
|
|
//
|
|
operator HKEY () const
|
|
{
|
|
return m_hKey ;
|
|
}
|
|
|
|
//
|
|
// Fill a key information structure
|
|
//
|
|
DWORD QueryKeyInfo ( CREGKEY_KEY_INFO * pRegKeyInfo ) ;
|
|
|
|
DWORD QueryTypeAndSize(LPCTSTR pszValueName, DWORD *pdwType, DWORD *pdwSize);
|
|
|
|
//
|
|
// Overloaded value query members; each returns ERROR_INVALID_PARAMETER
|
|
// if data exists but not in correct form to deliver into result object.
|
|
//
|
|
DWORD QueryValue ( LPCTSTR pchValueName, ::CString & strResult ) ;
|
|
DWORD QueryValue ( LPCTSTR pchValueName, CStringList & strList ) ;
|
|
DWORD QueryValue ( LPCTSTR pchValueName, DWORD & dwResult ) ;
|
|
DWORD QueryValue ( LPCTSTR pchValueName, CByteArray & abResult ) ;
|
|
DWORD QueryValue ( LPCTSTR pchValueName, void * pvResult, DWORD cbSize );
|
|
DWORD QueryValue ( LPCTSTR pchValueName, LPTSTR pszDestBuffer, DWORD cbSize, BOOL fExpandSz);
|
|
|
|
DWORD QueryValueExplicit(LPCTSTR pchValueName,
|
|
DWORD *pdwType,
|
|
DWORD *pdwSize,
|
|
LPBYTE *ppbData);
|
|
|
|
// Overloaded value setting members.
|
|
DWORD SetValue ( LPCTSTR pchValueName, LPCTSTR pszValue,
|
|
BOOL fRegExpand = FALSE) ;
|
|
DWORD SetValue ( LPCTSTR pchValueName, CStringList & strList ) ;
|
|
DWORD SetValue ( LPCTSTR pchValueName, DWORD & dwResult ) ;
|
|
DWORD SetValue ( LPCTSTR pchValueName, CByteArray & abResult ) ;
|
|
DWORD SetValue ( LPCTSTR pchValueName, void * pvResult, DWORD cbSize );
|
|
|
|
DWORD SetValueExplicit(LPCTSTR pchValueName,
|
|
DWORD dwType,
|
|
DWORD dwSize,
|
|
LPBYTE pbData);
|
|
|
|
protected:
|
|
HKEY m_hKey;
|
|
|
|
// Prepare to read a value by finding the value's size.
|
|
DWORD PrepareValue (
|
|
LPCTSTR pchValueName,
|
|
DWORD * pdwType,
|
|
DWORD * pcbSize,
|
|
BYTE ** ppbData
|
|
);
|
|
|
|
// Convert a CStringList to the REG_MULTI_SZ format
|
|
static DWORD FlattenValue (
|
|
CStringList & strList,
|
|
DWORD * pcbSize,
|
|
BYTE ** ppbData
|
|
);
|
|
|
|
// Convert a CByteArray to a REG_BINARY block
|
|
static DWORD FlattenValue (
|
|
CByteArray & abData,
|
|
DWORD * pcbSize,
|
|
BYTE ** ppbData
|
|
);
|
|
};
|
|
|
|
//
|
|
// Iterate the values of a key, return the name and type
|
|
// of each.
|
|
//
|
|
class TFS_EXPORT_CLASS RegValueIterator
|
|
{
|
|
protected:
|
|
RegKey * m_pRegKey;
|
|
DWORD m_dwIndex ;
|
|
TCHAR * m_pszBuffer ;
|
|
DWORD m_cbBuffer ;
|
|
|
|
public:
|
|
RegValueIterator();
|
|
~ RegValueIterator () ;
|
|
|
|
HRESULT Init(RegKey *pRegKey);
|
|
|
|
//
|
|
// Get the name (and optional last write time) of the next key.
|
|
//
|
|
HRESULT Next ( ::CString * pstName, DWORD * pdwType ) ;
|
|
|
|
//
|
|
// Reset the iterator
|
|
//
|
|
void Reset ()
|
|
{
|
|
m_dwIndex = 0 ;
|
|
}
|
|
};
|
|
|
|
//
|
|
// Iterate the sub-key names of a key.
|
|
//
|
|
|
|
class TFS_EXPORT_CLASS RegKeyIterator
|
|
{
|
|
public:
|
|
RegKeyIterator();
|
|
~RegKeyIterator();
|
|
|
|
HRESULT Init(RegKey *pRegKey);
|
|
|
|
HRESULT Next(::CString *pstName, CTime *pTime = NULL);
|
|
HRESULT Reset();
|
|
|
|
protected:
|
|
RegKey * m_pregkey;
|
|
DWORD m_dwIndex;
|
|
TCHAR * m_pszBuffer;
|
|
DWORD m_cbBuffer;
|
|
};
|
|
|
|
|
|
#endif _TREGKEY_H
|