查看完整版本: 一个封装注册表函数的类

luoshayu 2006-4-22 17:31

一个封装注册表函数的类

regcls.h

#ifndef        _REG_CLASS_H_
#define        _REG_CLASS_H_

#include <windows.h>
#include <string>
#include <list>
using namespace std;

class        REGKEY
{
public:
        DWORD        m_dwType;
        string        m_sValue;
        string        m_sKeyName;

        REGKEY()
        {
                ;
        }

        REGKEY(DWORD dwType,LPCSTR psName,LPCSTR psValue)
        {
                m_dwType        = dwType;
                if(psName)
                        m_sKeyName        = psName;
                if(psValue)
                        m_sValue        = psValue;
        }
};

class        CRegClass
{
public:
        CRegClass(HKEY hRoot = NULL)
        {
                if(hRoot==NULL)
                        m_hRoot        = HKEY_LOCAL_MACHINE;
                else
                        m_hRoot = hRoot;
        }

        ~CRegClass()
        {
                ;
        }
       
        //设置注册表操作的根
        void        SetRegRoot(HKEY hRoot)
        {
                m_hRoot = hRoot;
        }

        //得到一个注册表项的所有键
        bool        GetRegAllSubValue(LPCSTR lpKey,list<REGKEY> &subValueList)
        {
                HKEY        hKey                        = NULL;
                string        sName                        ;
                DWORD        dwType                        = 0;
                char *        psValue                        = NULL;
                DWORD        dwIndex                        = 0;
                DWORD        dwValLen                = 0;
                DWORD        dwNameLen                = 0;
                char        szName[1024]        = "";

                if(!lpKey || RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
                        return false;

                //枚举
                while(true)
                {
                        //得到值的长度
                        dwNameLen        = sizeof(szName);
                        dwValLen        = 0;
                        RegEnumValue(hKey,dwIndex,szName,&dwNameLen,NULL,&dwType,NULL,&dwValLen);
       
                        if(sName.compare(szName)==0)
                                break;

                        sName = szName;
               
                        if(dwValLen==0)
                        {
                                subValueList.push_back(REGKEY(dwType,szName,NULL));
                                dwIndex++;
                                continue;
                        }
                        dwNameLen        = sizeof(szName);
                        dwValLen        +=1;
                        psValue                = new char[dwValLen];
                        RegEnumValue(hKey,dwIndex,szName,&dwNameLen,NULL,&dwType,(BYTE *)psValue,&dwValLen);
                       
                        REGKEY        regKey        ;
                       
                        regKey.m_dwType        = dwType;
                        regKey.m_sKeyName        = szName;
                        regKey.m_sValue.append(psValue,dwValLen);

                        delete [] psValue;
                        psValue        = NULL;

                        subValueList.push_back(regKey);

                        dwIndex++;
                }
                return true;
        }

        //得到一个注册表项的所有子项
        bool        GetRegAllSubKey(LPCSTR lpKey,list<string> &subKeyList)
        {
                HKEY        hKey                        = NULL;
                string        sName                        ;
                DWORD        dwIndex                        = 0;
                DWORD        dwNameLen                = 0;
                char        szName[1024]        = "";

                if(!lpKey || RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
                        return false;

                //枚举
                while(true)
                {
                        //得到值的长度
                        dwNameLen        = sizeof(szName);
                        RegEnumKey(hKey,dwIndex,szName,dwNameLen);
       
                        if(sName.compare(szName)==0)
                                break;

                        sName = szName;
               
                        subKeyList.push_back(szName);
                        dwIndex++;
                }
                return true;
        }

        bool        ReadReg(LPCSTR lpKey,LPCSTR lpItem,DWORD &dwType,LPSTR lpBuf,DWORD &bufLen)
        {
                HKEY                                hKey                = NULL;

                if(lpKey==NULL || strlen(lpKey)==0)
                        return false;
                if(RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
                        return false;

                if(RegQueryValueEx(hKey,lpItem,NULL,&dwType,(unsigned char *)lpBuf,&bufLen)!=ERROR_SUCCESS)
                        return FALSE;

                RegCloseKey(hKey);
               
                hKey = NULL;
                return        true;
        }

        bool        WriteReg(LPCSTR lpKey,LPCSTR lpItem,DWORD dwType,LPCSTR lpBuf,DWORD bufLen)
        {
                HKEY        hKey        = NULL;

                if(!lpKey || strlen(lpKey)==0)
                        return false;

                if(!CreateRegTree(lpKey))
                        return false;

                if(RegOpenKey(m_hRoot,lpKey,&hKey)!=ERROR_SUCCESS)
                        return false;
                if(!RegSetValueEx(hKey,lpItem,0,dwType,(BYTE *)lpBuf,bufLen)!=ERROR_SUCCESS)
                        return false;
                RegCloseKey(hKey);

                return true;
        }

        //读一个注册表项
        bool        ReadReg(LPCSTR lpKey,DWORD &dwType,LPSTR lpBuf,DWORD &bufLen)
        {
                int                                        n                        = 0;
                string::size_type        nPos                ;
                bool                                bRet                = false;
                string                                sKey                ;
                string                                sPath                ;

                if(!lpKey)
                {
                        return false;
                }

                sPath = lpKey;

                if((nPos = sPath.rfind("\\"))==string::npos)
                        return false;

                sKey = sPath.substr(nPos+1);
                sPath.erase(nPos);

                return ReadReg(sPath.c_str(),sKey.c_str(),dwType,lpBuf,bufLen);

        }

        //写一个注册表项
        bool        WriteReg(LPCSTR lpKey,DWORD dwType,LPCSTR lpBuf,DWORD dwBufLen)
        {
                int                                        n                        = 0;
                HKEY                                hKey                = NULL;
                string::size_type        nPos                ;
                bool                                bRet                = false;
                string                                sKey                ;
                string                                sPath                ;

                if(!lpKey)
                {
                        return false;
                }

                sPath = lpKey;

                if((nPos = sPath.rfind("\\"))==string::npos)
                        return false;

                sKey = sPath.substr(nPos+1);
                sPath.erase(nPos);

                return        WriteReg(sPath.c_str(),sKey.c_str(),dwType,lpBuf,dwBufLen);
        }

        //删除一个注册表项
        bool        DelRegKey(LPCSTR lpKey)
        {
                int                                        n                        = 0;
                HKEY                                hKey                = NULL;
                string::size_type        nPos                ;
                bool                                bRet                = false;
                string                                sKey                ;
                string                                sPath                ;

                if(!lpKey)
                {
                        return false;
                }

                sPath = lpKey;

                if((nPos = sPath.rfind("\\"))==string::npos)
                        return false;
                sKey = sPath.substr(nPos+1);
                sPath.erase(nPos);

                if(RegOpenKey(m_hRoot,sPath.c_str(),&hKey)!=ERROR_SUCCESS)
                        return false;
               
                RegDeleteKey(hKey,sKey.c_str());
                RegCloseKey(hKey);
               
                return true;
        }

        //删除一个注册表项的值
        bool        DelRegValue(LPCSTR lpKey)
        {
                int                                        n                        = 0;
                HKEY                                hKey                = NULL;
                string::size_type        nPos                ;
                bool                                bRet                = false;
                string                                sKey                ;
                string                                sPath                ;

                if(!lpKey)
                {
                        return false;
                }

                sPath = lpKey;

                if((nPos = sPath.rfind("\\"))==string::npos)
                        return false;
                sKey = sPath.substr(nPos+1);
                sPath.erase(nPos);

                if(RegOpenKey(m_hRoot,sPath.c_str(),&hKey)!=ERROR_SUCCESS)
                        return false;
               
                RegDeleteValue(hKey,sKey.c_str());
                RegCloseKey(hKey);
               
                return true;
        }

        //删除一个注册表树
        bool        DelRegTree(LPCSTR lpKey)
        {
                //搜索所有的子项
                string::size_type        nPos                ;
                string                                sKey                ;
                HKEY                                hSubKey                = NULL;
                string                                sSubKey                ;
                string                                sParentKey        ;
                list<string>                subKeyList        ;

                if(!lpKey)
                        return false;

                sParentKey = lpKey;
                nPos = sParentKey.rfind("\\");
                if(nPos==string::npos)
                {
                        return false;
                }

                sKey = sParentKey.substr(nPos+1);
                sParentKey.erase(nPos);

                GetRegAllSubKey(lpKey,subKeyList);

                for(list<string>::iterator iter = subKeyList.begin();iter!=subKeyList.end();iter++)
                {
                        sSubKey = lpKey;
                        if(sSubKey.at(sSubKey.size()-1)!='\\')
                                sSubKey+="\\";
                        sSubKey+=*iter;

                        DelRegTree(sSubKey.c_str());
                }

                //打开父项
                RegOpenKey(m_hRoot,sParentKey.c_str(),&hSubKey);
                if(!hSubKey)
                        return false;

                RegDeleteKey(hSubKey,sKey.c_str());
                RegCloseKey(hSubKey);
                hSubKey = NULL;

                return true;
        }

        //创建一个注册表树
        bool        CreateRegTree(LPCSTR lpKey)
        {
                int                                        n                        = 0;
                HKEY                                hKey                = NULL;
                string::size_type        nPos                ;
                bool                                bRet                = false;
                string                                sKey                ;
                string                                sPath                ;
                HKEY                                hSubKey                = NULL;
                bool                                bBreak                = false;

                if(!lpKey)
                {
                        return false;
                }

                sPath = lpKey;

                if((nPos = sPath.rfind("\\"))==string::npos)
                        return false;

                while(1)
                {

                        if((nPos=sPath.find(nPos,'\\'))==string::npos)
                        {
                                sKey        = sPath;
                                bBreak        = true;
                                bRet        = true;
                        }
                        else
                        {
                                sKey = sPath.substr(0,nPos);
                                nPos+=1;
                        }

                        if(RegOpenKey(m_hRoot,sKey.c_str(),&hKey)!=ERROR_SUCCESS)
                        {
                                //如果打开失败则创建
                                if(RegCreateKeyEx(m_hRoot,sKey.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hSubKey,NULL)==ERROR_SUCCESS)
                                {
                                        RegCloseKey(hSubKey);
                                        hSubKey = NULL;
                                }
                                else
                                {
                                        bBreak        = true;
                                        bRet        = false;
                                }
                        }
                        else
                                RegCloseKey(hKey);

                        if(bBreak)
                                break;
                }

                return bRet;
        }

private:
        HKEY        m_hRoot        ;
};
#endif        _REG_CLASS_H_
页: [1]
查看完整版本: 一个封装注册表函数的类