CReg类轻松读取注册表

//========================================================================
//TITLE:
//    CReg类轻松读取注册表
//AUTHOR:
//    norains
//DATE:
//    Sunday  8-April-2007
//Environment:
//        EVC4.0 + Standard SDK
//========================================================================

        开篇之处先说说这个类的来历.准确的说,这个类是我垂诞已久的东东,昨天在查看微软的控制面板的代码时,不小心发现的.觉得使用上挺便利的,所以本着"洋为中用"的原则,拷贝出来用吧!
        
/////////////////////////////////////////////////////////////////////        
// Reg.h: interface for the CReg class.
//
//Version:
//    1.0.0
//Date:
//    2007.04.07
//////////////////////////////////////////////////////////////////////

#ifndef REG_H
#define REG_H 



class CReg  
{
public:
    BOOL DeleteKey(LPCTSTR szName);
    BOOL DeleteValue(LPCTSTR szName);
    BOOL SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen);
    BOOL SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen);
    BOOL SetDW(LPCTSTR szName, DWORD dwValue);
    BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue);
    BOOL SetSZ(LPCTSTR szName, LPCTSTR szValue, DWORD dwLen);
    DWORD GetValueDW(LPCTSTR szName, DWORD dwDefault
=0);
    LPCTSTR GetValueSZ(LPCTSTR szName);
    LPBYTE GetValueBinary(LPCTSTR szName);
    DWORD GetValueBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen);
    BOOL GetValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen);
    BOOL EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue);
    BOOL EnumKey(LPTSTR psz, DWORD dwLen);
    BOOL IsOK();
    
operator HKEY();
    
void Reset();
    CReg(HKEY hkRoot, LPCTSTR pszKey);
    BOOL Open(HKEY hkRoot, LPCTSTR pszKey, REGSAM sam
=KEY_READ);
    BOOL Create(HKEY hkRoot, LPCTSTR pszKey);
    CReg();
    
virtual ~CReg();

private:
    HKEY    m_hKey;
    
int        m_Index;
    LPBYTE    m_lpbValue; 
// last value read, if any
}
;

#endif //#ifndef REG_H



//////////////////////////////////////////////////////////////////////
// Reg.cpp: implementation of the CReg class.
//
//////////////////////////////////////////////////////////////////////

#include 
"stdafx.h"
#include 
"Reg.h"


//=======================================================================
//Macro define
#define MyFree(p)            { if(p) LocalFree(p); }
//=======================================================================
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CReg::CReg()
{
    m_hKey 
= NULL;
    m_Index 
= 0;
    m_lpbValue 
= NULL;
}


CReg::CReg(HKEY hkRoot, LPCTSTR pszKey)
{
    m_hKey 
= NULL;
    m_Index 
= 0;
    m_lpbValue 
= NULL;
    Open(hkRoot, pszKey);
}



CReg::
~CReg()
{
    
if(m_hKey)
    
{
        RegCloseKey(m_hKey);
    }

    MyFree(m_lpbValue);
}



//-------------------------------------------------------------------
//Description:
//    Create the key
//-------------------------------------------------------------------
BOOL CReg::Create(HKEY hkRoot, LPCTSTR pszKey)
{
    DWORD dwDisp;
    
return ERROR_SUCCESS == RegCreateKeyEx(hkRoot, pszKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &m_hKey, &dwDisp);
}



//-------------------------------------------------------------------
//Description:
//    Open the key
//-------------------------------------------------------------------
BOOL CReg::Open(HKEY hkRoot, LPCTSTR pszKey, REGSAM sam)
{
    
return ERROR_SUCCESS == RegOpenKeyEx(hkRoot, pszKey, 0, sam, &m_hKey);
}


//-------------------------------------------------------------------
//Description:
//    Reset the value
//-------------------------------------------------------------------
void CReg::Reset()
{
    
if(m_hKey)
    
{
        RegCloseKey(m_hKey); 
    }

    MyFree(m_lpbValue);
    m_hKey 
= NULL;
    m_Index 
= 0;
    m_lpbValue 
= NULL;
}


//-------------------------------------------------------------------
//Description:
//    Operator overload
//-------------------------------------------------------------------
CReg::operator HKEY()
{
    
return m_hKey;
}


//-------------------------------------------------------------------
//Description:
//    Test whether is the handle of the key OK for next operate
//-------------------------------------------------------------------
BOOL CReg::IsOK()
{
    
return m_hKey != NULL;
}



//-------------------------------------------------------------------
//Description:
//    Enum the key
//-------------------------------------------------------------------
BOOL CReg::EnumKey(LPTSTR psz, DWORD dwLen)
{
    
if(!m_hKey)
    
{
        
return FALSE;
    }

    
    
return ERROR_SUCCESS == RegEnumKeyEx(m_hKey, m_Index++, psz, &dwLen, NULL, NULL, NULL, NULL);
}



//-------------------------------------------------------------------
//Description:
//    Enum registry Value
//-------------------------------------------------------------------
BOOL CReg::EnumValue(LPTSTR pszName, DWORD dwLenName, LPTSTR pszValue, DWORD dwLenValue)
{
    DWORD dwType;

    
if(!m_hKey) 
    
{
        
return FALSE;
    }

    
    dwLenValue 
*= sizeof(TCHAR); // convert length in chars to bytes
    
    
return ERROR_SUCCESS == RegEnumValue(m_hKey, m_Index++, pszName, &dwLenName, NULL, &dwType, (LPBYTE)pszValue, &dwLenValue);
}



//-------------------------------------------------------------------
//Description:
//    Get the string value
//-------------------------------------------------------------------
BOOL CReg::GetValueSZ(LPCTSTR szName, LPTSTR szValue, DWORD dwLen)
{
    
if(!m_hKey)
    
{
        
return FALSE;
    }

    
    dwLen 
*= sizeof(TCHAR); // convert length in chars to bytes
    
    
return ERROR_SUCCESS == RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)szValue, &dwLen);
}


//-------------------------------------------------------------------
//Description:
//    Get the binary value
//-------------------------------------------------------------------
DWORD CReg::GetValueBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen)
{
    
if(!m_hKey) 
    
{
        
return FALSE;
    }


    DWORD dwLenWant 
= dwLen;
    
if(ERROR_SUCCESS == RegQueryValueEx(m_hKey, szName, NULL, NULL, lpbValue, &dwLen))
    
{
        
return dwLen;
    }

    
else
    
{
        
return 0;
    }

}



//-------------------------------------------------------------------
//Description:
//    Get the binary value
//-------------------------------------------------------------------
LPBYTE CReg::GetValueBinary(LPCTSTR szName)
{
    
return (LPBYTE)GetValueSZ(szName);
}



//-------------------------------------------------------------------
//Description:
//    Get the string value
//-------------------------------------------------------------------
LPCTSTR CReg::GetValueSZ(LPCTSTR szName)
{
    
return 0;
}



//-------------------------------------------------------------------
//Description:
//    Get the DWORD value
//
//Parameters:
//    szName:[in] The value of registry
//    dwDefault:[in] The default value return when failed in getting the 
//DWORD value.
//-------------------------------------------------------------------
DWORD CReg::GetValueDW(LPCTSTR szName, DWORD dwDefault)
{
    
if(!m_hKey) 
    
{
        
return FALSE;
    }

    DWORD dwValue 
= dwDefault;
    DWORD dwLen 
= sizeof(DWORD);
    RegQueryValueEx(m_hKey, szName, NULL, NULL, (LPBYTE)
&dwValue, &dwLen);
    
return dwValue;
}



//-------------------------------------------------------------------
//Description:
//    Set the string value
//-------------------------------------------------------------------
BOOL CReg::SetSZ(LPCTSTR szName, LPCTSTR szValue, DWORD dwLen)
{
    
//Prefix
    if(!m_hKey) 
    
{
        
return FALSE;
    }

    
    
return ERROR_SUCCESS == RegSetValueEx(m_hKey, szName, 0, REG_SZ, (LPBYTE)szValue, sizeof(TCHAR)*dwLen);
}



//-------------------------------------------------------------------
//Description:
//    Set the string value
//-------------------------------------------------------------------
BOOL CReg::SetSZ(LPCTSTR szName, LPCTSTR szValue)
{
    
return SetSZ(szName, szValue, 1+lstrlen(szValue));
}



//-------------------------------------------------------------------
//Description:
//    Get the DWORD value
//-------------------------------------------------------------------
BOOL CReg::SetDW(LPCTSTR szName, DWORD dwValue)
{
    
//Prefix
    if(!m_hKey) 
    
{
        
return FALSE;
    }

    
    
return ERROR_SUCCESS==RegSetValueEx(m_hKey, szName, 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));
}



//-------------------------------------------------------------------
//Description:
//    Get the binary value
//-------------------------------------------------------------------
BOOL CReg::SetBinary(LPCTSTR szName, LPBYTE lpbValue, DWORD dwLen)
{
    
//Prefix
    if(!m_hKey) 
    
{
        
return FALSE;
    }


    
return ERROR_SUCCESS == RegSetValueEx(m_hKey, szName, 0, REG_BINARY, lpbValue, dwLen);
}



//-------------------------------------------------------------------
//Description:
//    Set the Multi value
//-------------------------------------------------------------------
BOOL CReg::SetMultiSZ(LPCTSTR szName, LPCTSTR lpszValue, DWORD dwLen)
{
    
return ERROR_SUCCESS == RegSetValueEx(m_hKey, szName, 0, REG_MULTI_SZ, (LPBYTE)lpszValue, sizeof(TCHAR)*dwLen);
}



//-------------------------------------------------------------------
//Description:
//    Delete the value
//-------------------------------------------------------------------
BOOL CReg::DeleteValue(LPCTSTR szName)
{
    
//Prefix
    if(!m_hKey) 
    
{
        
return FALSE;
    }

    
//
    return ERROR_SUCCESS == RegDeleteValue(m_hKey, szName);
}




//-------------------------------------------------------------------
//Description:
//    Delete Key
//-------------------------------------------------------------------
BOOL CReg::DeleteKey(LPCTSTR szName)
{
    
if(!m_hKey) 
    
{
        
return FALSE;
    }

    
    
return ERROR_SUCCESS == RegDeleteKey(m_hKey, szName);
}


        使用CReg类读取注册表非常方便,至少不用再去翻查platform builder文档上的注册表函数了^_^.
       
        以将注册表中"HKEY_CURRENT_USER/ControlPanel/Volume"的"Screen"(DWORD类型)数值设置为2作例子:
 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel/Volume"));
 reg.SetDW(TEXT(
"Screen"),Screen);

        要读取也挺简单:
DWORD dwValue = reg.GetValueDW(TEXT("Screen"));

        其它函数的功能,可以依照函数名推断,并且使用方法也很简单,在此不再赘述.
       
        需要注意的是,这些代码是直接从微软代码集中拷贝过来的,原代码GetValueBinary(LPCTSTR szName)和GetValueSZ(LPCTSTR szName)的功能尚未完成.最近因为工作关系,在发表这篇豆腐块前,也没将这两个函数补完.如果各位朋友有兴趣,可以自行将之补全.当然,如果补全后能给我发封e-mail,我会表示最衷心的感激:-)
posted @ 2007-04-08 10:17  我的一天  阅读(277)  评论(0编辑  收藏  举报