上个星期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

COMMENTS