windows-nt/Source/XPSP1/NT/shell/ext/shtl/simreg.h
2020-09-26 16:20:57 +08:00

142 lines
5 KiB
C++

//+-------------------------------------------------------------------------
//
// Copyright (C) Silicon Prairie Software, 1996
//
// File: simreg.h
//
// Contents: CRegFile
//
// Simple Win32/Win16 registry manipulation class
// Copyright (c)1996, Shaun Ivory
// All rights reserved
// Used with permission
//
// History: Sep-26-96 Davepl Created
//
//--------------------------------------------------------------------------
#pragma once
#include "shtl.h"
#include "tstring.h"
#include <winreg.h>
#if defined(WIN32) || defined(_WIN32)
#define SIMREG_WIN32
#else
#define SIMREG_WIN16
#endif
#define INVALID_HKEY ((HKEY)-1)
class CSimpleReg
{
private:
tstring m_SubKeyName;
HKEY m_hKeyRoot;
HKEY m_hSubKey;
unsigned char m_bOpenSuccess;
unsigned char m_bCreate;
#if defined(SIMREG_WIN32)
LPSECURITY_ATTRIBUTES m_lpsaSecurityAttributes;
#endif
private:
// Some of the Reg... functions inexplicably require non const strings
static LPTSTR Totstring( const tstring &s ) { return (LPTSTR)(LPCTSTR)s; }
unsigned char Assign( const CSimpleReg &other );
public:
enum
{
PreOrder=0,
PostOrder=1
};
struct CKeyEnumInfo
{
tstring Name;
HKEY Root;
int Level;
void *ExtraData;
};
struct CValueEnumInfo
{
tstring Name;
DWORD Type;
DWORD Size;
void *ExtraData;
};
typedef int (*SimRegKeyEnumProc)( CKeyEnumInfo &enumInfo );
typedef int (*SimRegValueEnumProc)( CValueEnumInfo &enumInfo );
// Constructors, destructor
#if defined(SIMREG_WIN32)
CSimpleReg( HKEY, const tstring&, unsigned char forceCreate=0, LPSECURITY_ATTRIBUTES lpsa=NULL );
#else
CSimpleReg( HKEY, const tstring&, unsigned char forceCreate=0 );
#endif
CSimpleReg(void);
CSimpleReg(const CSimpleReg &other);
~CSimpleReg(void);
CSimpleReg &operator=(const CSimpleReg& );
// Query functions
unsigned long Size( const tstring &key );
unsigned long Type( const tstring &key );
unsigned char Query( const tstring &key, LPTSTR szValue, unsigned short maxLen );
unsigned char Query( const tstring &key, tstring &value, unsigned short maxLen=0 );
unsigned char Query( const tstring &key, DWORD &value );
unsigned char Query( const tstring &key, int &value );
unsigned char Query( const tstring &key, LONG &value );
unsigned char Query( const tstring &key, BYTE &value );
unsigned char Query( const tstring &key, WORD &value );
unsigned char QueryBin( const tstring &key, void *value, DWORD size );
void Query( const tstring &key, DWORD &value, const DWORD &defaultvalue );
template<class _TYPE> _TYPE Query( const tstring &key, const _TYPE &defaultvalue )
{
_TYPE result;
if (Query(key, result))
return result;
else
return defaultvalue;
}
// Set functions
unsigned char SetBin( const tstring &key, void *value, DWORD size );
unsigned char Set( const tstring &key, const tstring &value );
unsigned char Set( const tstring &key, DWORD value );
unsigned char Open(void);
unsigned char Close(void);
unsigned char ForceCreate( unsigned char create = TRUE );
unsigned char SetRoot( HKEY keyClass, const tstring &newRoot );
#if defined(SIMREG_WIN32)
void SecurityAttributes( const LPSECURITY_ATTRIBUTES lpsa ) { m_lpsaSecurityAttributes = lpsa; }
const LPSECURITY_ATTRIBUTES SecurityAttributes(void) const { return m_lpsaSecurityAttributes; }
#endif
DWORD CountKeys(void);
static HKEY GetHkeyFromName( const tstring &Name );
static unsigned char Delete( HKEY, const tstring &key );
static int DeleteRecursively( HKEY root, const tstring &name );
// Inlines
tstring SubKeyName(void) const {return (m_SubKeyName);}
unsigned char ForceCreate(void) const {return (m_bCreate);}
unsigned char OK(void) const {return (m_bOpenSuccess);}
HKEY GetRootKey(void) const {return (m_hKeyRoot);}
HKEY GetSubKey(void) const {return (m_hSubKey);}
int operator!(void) const {return (!m_bOpenSuccess);}
static HKEY GetWin16HKey( HKEY key );
int EnumValues( SimRegValueEnumProc enumProc, void *extraInfo = NULL );
int RecurseKeys( SimRegKeyEnumProc enumProc, void *extraInfo = NULL, int recurseOrder = CSimpleReg::PostOrder, int failOnOpenError = 1 );
int EnumKeys( SimRegKeyEnumProc enumProc, void *extraInfo = NULL, int failOnOpenError = 1 );
private:
static int DoRecurseKeys( HKEY key, const tstring &root, SimRegKeyEnumProc enumProc, void *extraInfo, int level, int recurseOrder, int failOnOpenError );
static int DoEnumKeys( HKEY key, const tstring &root, SimRegKeyEnumProc enumProc, void *extraInfo, int failOnOpenError );
static int DeleteEnumKeyProc( CSimpleReg::CKeyEnumInfo &enumInfo );
};