一个自己封装的注册表操作类——CRegistry


上个星期KO的东西,本来应该提前发布的,无奈碰到Blogger被墙,找了N久的Blog替代,最后才决定到这里(其实最想的是自己弄一个独立的,但是没条件-。-)

写这个玩意儿是因为在写AutorunLoadviewer的时候,碰到了需要操作注册表的地方,但是MFC没有相应的Class,而ATL的那个CRegKey缺乏我需要的功能,而且CRegKey的所有Member Function都是inline的……所以就自己动手写了这个类

目前支持:CreateKey/Open/Write/Read/EnumKey/EnumValue/DeleteKey/DeleteValue

因为是按照个人需求写的,所以某些功能尚未添加,如果你需要的话,可以自己添加

PS:CRegistry继承自MFC的CObject,如果你需要在MFC之外使用,请自行去掉相关的代码

然后发布下代码

/**************************************************

** Project:AutorunLoadViewer

** File:Registry.h

** Edition:v1.0.0 Beta

** Coder:KingsamChen [MDSA Group]

** Last Modify:2009-5-9

**************************************************/

#pragma once

class CRegistry : public CObject
{
DECLARE_DYNAMIC(CRegistry)

public:
CRegistry(HKEY hKey = HKEY_LOCAL_MACHINE);
virtual ~CRegistry();
void Close();
inline void SetBasicKey(HKEY hKey);
BOOL CreateKey(LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS);
BOOL Open(LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS);
BOOL EnumValue(DWORD dwIndex, LPTSTR lpszValueName, LPDWORD lpdwValueSize, LPBYTE lpbtData = NULL, LPDWORD lpdwDataSize = NULL);
BOOL EnumKey(DWORD dwIndex, LPTSTR lpszKeyName, LPDWORD lpdwNameSize);
BOOL Read(LPCTSTR lpszValueName, LPTSTR lpszData, LPDWORD lpdwDataSize);
BOOL Read(LPCTSTR lpszValueName, DWORD &dwData);
BOOL Write(LPCTSTR lpszValueName, LPCTSTR lpszData);
BOOL Write(LPCTSTR lpszValueName, DWORD dwData);
BOOL DeleteKey(LPCTSTR lpszSubKeyName);
BOOL DeleteValue(LPCTSTR lpszValueName);

protected:
HKEY m_hKey;
};

/**************************************************

** Project:AutorunLoadViewer

** File:Registry.cpp

** Edition:v1.0.0 Beta

** Coder:KingsamChen [MDSA Group]

** Last Modify:2009-5-17

**************************************************/

#include "stdafx.h"
#include "AutorunLoadViewer.h"
#include "Registry.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

IMPLEMENT_DYNAMIC(CRegistry, CObject)

//=========================================
// 函数名: CRegisty
// 输  入: hKey(HKEY) - 要打开的键值
// 输  出: -
// 功  能: 构造函数
//=========================================
CRegistry::CRegistry(HKEY hKey)
{
m_hKey = hKey;
}

//=========================================
// 函数名: ~CRegistry
// 输  入: -
// 输  出: -
// 功  能: 析构函数
//=========================================
CRegistry::~CRegistry()
{
Close();
}

//=========================================
// 函数名: Close
// 输  入: -
// 输  出: -
// 功  能: 清理打开的键值句柄
//=========================================
void CRegistry::Close()
{
if (m_hKey)
{
::RegCloseKey(m_hKey);
m_hKey = NULL;
}
}

//=========================================
// 函数名: SetBasicKey
// 输  入: hKey(HKEY) - 主键句柄
// 输  出: -
// 功  能: 设置类的主键变量
//=========================================
inline void CRegistry::SetBasicKey(HKEY hKey)
{
if (m_hKey)
{
::RegCloseKey(m_hKey);
}

m_hKey = hKey;
}

//=========================================
// 函数名: Open
// 输  入: lpszKeyName(LPCTSTR) - 要打开的子键值
//				 samDesired(REGSAM) - 指定的权限
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 打开指定子键值
//=========================================
BOOL CRegistry::Open( LPCTSTR lpszKeyName, REGSAM samDesired /*= KEY_ALL_ACCESS*/ )
{
// 有效性检查
ASSERT(m_hKey);
ASSERT(lpszKeyName);

HKEY hNewKey;
long lRet;

// 打开制定键值
lRet = ::RegOpenKeyEx(m_hKey, lpszKeyName, 0, samDesired, &hNewKey);

if (ERROR_SUCCESS == lRet)
{
m_hKey = hNewKey;
return TRUE;
}

TRACE(_T("Open Key Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: EnumValue
// 输  入: dwIndex(DWORD) - Value的索引
//				 lpszValueName(LPTSTR) - Value Name的缓冲区
//				 lpdwValueSize(LPDWORD) - 指示写入缓冲区的字符数
//				 lpbtData(LPBYTE) - 相应Data的缓冲区
//				 lpdwDataSize(LPDWORD) - 指示写入缓冲区的字符数
// 输  出: BOOL - TRUE:成功, FALSE:没有多余的项, EV_ERROR:错误
// 功  能: 枚举打开的键值的Value和相应的Data
//=========================================
BOOL CRegistry::EnumValue( DWORD dwIndex, LPTSTR lpszValueName, LPDWORD lpdwValueSize, LPBYTE lpbtData /*= NULL*/, LPDWORD lpdwDataSize /*= NULL*/)
{
ASSERT(m_hKey);
ASSERT(lpszValueName);

long lRet;
DWORD dwRegType = REG_SZ;
const BOOL EV_ERROR = -1;

// 获取Value值和相应的Data
lRet = ::RegEnumValue(m_hKey, dwIndex, lpszValueName, lpdwValueSize, NULL,
&dwRegType, lpbtData, lpdwDataSize);

if (ERROR_NO_MORE_ITEMS == lRet)
{
return FALSE;
}
else if (lRet != ERROR_SUCCESS)
{
TRACE(_T("EnumValue Error: %d\n"), ::GetLastError());
return EV_ERROR;
}

return TRUE;
}

//=========================================
// 函数名: CreateKey
// 输  入: lpszKeyName(LPCTSTR) - 创建的子键名
//				 samDesired(REGSAM) - 目标权限
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 创建子键
//=========================================
BOOL CRegistry::CreateKey( LPCTSTR lpszKeyName, REGSAM samDesired /*= KEY_ALL_ACCESS*/ )
{
ASSERT(m_hKey);
ASSERT(lpszKeyName);

long lRet;
HKEY hNewKey = NULL;

// 这里需要KEY_QUERY_VALUE权限
lRet = ::RegCreateKeyEx(m_hKey, lpszKeyName, 0, NULL, REG_OPTION_NON_VOLATILE,
samDesired, NULL, &hNewKey, NULL);

if (ERROR_SUCCESS == lRet)
{
m_hKey = hNewKey;
return TRUE;
}

TRACE(_T("Create Key Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: EnumKey
// 输  入: dwIndex(DWORD) - SubKey的索引
//				 lpszKeyName(LPTSTR) - 保存SubKey的名字
//				 lpdwNameSize(LPDWORD) - 指示上个参数的缓冲区大小
// 输  出: BOOL - TRUE:成功, FALSE:没有剩余SubKey, EK_ERROR:失败
// 功  能: 枚举子键名
//=========================================
BOOL CRegistry::EnumKey(DWORD dwIndex, LPTSTR lpszKeyName, LPDWORD lpdwNameSize)
{
ASSERT(m_hKey);
ASSERT(lpszKeyName);

long lRet;
const BOOL EK_ERROR = -1;

lRet = ::RegEnumKeyEx(m_hKey, dwIndex, lpszKeyName, lpdwNameSize, NULL,
NULL, NULL, NULL);

if (ERROR_NO_MORE_ITEMS == lRet)
{
return FALSE;
}
else if (lRet != ERROR_SUCCESS)
{
TRACE(_T("EnumKey Error: %d\n"), ::GetLastError());
return EK_ERROR;
}

return TRUE;
}

//=========================================
// 函数名: Read
// 输  入: lpszValueName(LPCTSTR) - 指定的Value名
//				 lpszData(LPTSTR) - 保存Value的数据
//				 lpdwDataSize(LPDWORD) - 上个参数的缓冲区大小
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 返回指定Value项的数据(字符串型)
//=========================================
BOOL CRegistry::Read( LPCTSTR lpszValueName, LPTSTR lpszData, LPDWORD lpdwDataSize )
{
// 按照MSDN说的,Name为NULL时返回默认的
// 所以就不用ASSERT了
ASSERT(m_hKey);
ASSERT(lpszData);

// 需要KEY_QUERY_VALUE权限
long lRet = ::RegQueryValueEx(m_hKey, lpszValueName, NULL, NULL,
(LPBYTE)lpszData, lpdwDataSize);

if (ERROR_SUCCESS == lRet)
{
return TRUE;
}

TRACE(_T("Read Value Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: Read
// 输  入: lpszValueName(LPCTSTR) - 指定的Value名
//				 dwData(DWORD&) - 保存Value的数据
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 返回指定Value的数据(DWORD型)
//=========================================
BOOL CRegistry::Read(LPCTSTR lpszValueName, DWORD &dwData)
{
ASSERT(m_hKey);

DWORD dwTmpData;
DWORD dwSize = sizeof(DWORD);
long lRet = ::RegQueryValueEx(m_hKey, lpszValueName, NULL, NULL,
(LPBYTE)(&dwTmpData), &dwSize);

if (ERROR_SUCCESS == lRet)
{
dwData = dwTmpData;
return TRUE;
}

TRACE(_T("Read Value Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: Write
// 输  入: lpszValueName(LPCTSTR) - 指定Value名
//				 lpszData(LPCTSTR) - 写入的数据
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 写入指定Value的字符串
//=========================================
BOOL CRegistry::Write(LPCTSTR lpszValueName, LPCTSTR lpszData)
{
ASSERT(m_hKey);
ASSERT(lpszData);

// 数据大小,直接用API
DWORD dwSize = (DWORD)(sizeof(TCHAR) * (lstrlen(lpszData) + 1));
long lRet = ::RegSetValueEx(m_hKey, lpszValueName, 0L, REG_SZ,
(const BYTE*)lpszData, dwSize);

if (ERROR_SUCCESS == lRet)
{
return TRUE;
}

TRACE(_T("Write Value Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: Write
// 输  入: lpszValueName(LPCTSTR) - 指定Value名
//				 dwData(DWORD) - 写入的数据
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 写入指定Value的DWORD数据
//=========================================
BOOL CRegistry::Write(LPCTSTR lpszValueName, DWORD dwData)
{
ASSERT(m_hKey);

long lRet = ::RegSetValueEx(m_hKey, lpszValueName, 0L, REG_DWORD,
(const BYTE*)&dwData, sizeof(DWORD));

if (ERROR_SUCCESS == lRet)
{
return TRUE;
}

TRACE(_T("Write Value Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: DeleteKey
// 输  入: lpszSubKeyName(LPCTSTR) - 删除的键名
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 删除指定子键值
//=========================================
BOOL CRegistry::DeleteKey(LPCTSTR lpszSubKeyName)
{
ASSERT(m_hKey);
ASSERT(lpszSubKeyName);

// 要删除的子键下不能有子键
// 要递归的删除子键及其下属子键, 可以枚举删除
// 或者使用SHDeleteKey
long lRet = ::RegDeleteKey(m_hKey, lpszSubKeyName);

if (ERROR_SUCCESS == lRet)
{
return TRUE;
}

TRACE(_T("Delete Key Error: %d\n"), ::GetLastError());
return FALSE;
}

//=========================================
// 函数名: DeleteValue
// 输  入: lpszValueName(LPCTSTR) - 指定Value名
// 输  出: BOOL - TRUE:成功, FALSE:失败
// 功  能: 删除指定Value值
//=========================================
BOOL CRegistry::DeleteValue(LPCTSTR lpszValueName)
{
ASSERT(m_hKey);
ASSERT(lpszValueName);

// 需要KEY_SET_VALUE权限
long lRet = ::RegDeleteValue(m_hKey, lpszValueName);

if (ERROR_SUCCESS == lRet)
{
return TRUE;
}

TRACE(_T("Delete Value Error: %d\n"), ::GetLastError());
return FALSE;
}

下载地址:CRegistry

, ,

  1. No comments yet.
(will not be published)