📄 regedit.cpp
字号:
/*
Copyright 2006 - 2008
ZhangLuduo <zhangluduo@msn.com>
All Rights Reserved.
注册表操作封装类
作者 - 张鲁夺(zhangluduo)
MSN - zhangluduo@msn.com
QQ群 - 34064264
为所有爱我的人和我爱的人努力!
*/
#include "stdafx.h"
#include "Regedit.h"
Regedit::Regedit()
{
m_hKey = NULL;
}
Regedit::~Regedit()
{
if(m_hKey != NULL)
RegCloseKey(m_hKey);
}
bool Regedit::Open(HKEY RootItem, const char* SubItem, bool bCreate)
{
Close();
if(RegOpenKey(RootItem, SubItem, &m_hKey) == ERROR_SUCCESS)
return true;
if(bCreate)
{
if(RegCreateKey(RootItem, SubItem, &m_hKey) == ERROR_SUCCESS)
return true;
}
return false;
}
void Regedit::Close()
{
if(m_hKey != NULL)
{
if(RegCloseKey(m_hKey) == ERROR_SUCCESS)
m_hKey = NULL;
}
}
bool Regedit::SetValue( /* in */ HKEY RootItem,
/* in */ const char* SubItem,
/* in */ unsigned long ValueType,
/* in */ const char* KeyName,
/* in */ const unsigned char* Data,
/* in */ unsigned long DataLen)
{
Close();
if(!Open(RootItem, SubItem, true))
{
Close();
return false;
}
bool bValue = RegSetValueEx(m_hKey, KeyName, 0, ValueType, Data, DataLen) == ERROR_SUCCESS ? true : false;
Close();
return bValue;
}
ValueBuf Regedit::ReadValue(/* in */ HKEY RootItem,
/* in */ const char* SubItem,
/* in */ const char* KeyName,
/* out */ unsigned long* DataType,
/* out */ unsigned long* DataLen)
{
Close();
if(!Open(RootItem, SubItem, false))
{
Close();
return "";
}
//通过DataLen查询数据长度
if(RegQueryValueEx(m_hKey, KeyName, 0, DataType, 0, DataLen) != ERROR_SUCCESS)
{
Close();
return "";
}
//分配数据缓冲区
unsigned char* DataBuf = new unsigned char[*DataLen];
memset(DataBuf, 0, *DataLen);
// 查询值
if(RegQueryValueEx(m_hKey, KeyName, 0, DataType, DataBuf, DataLen) != ERROR_SUCCESS)
{
Close();
delete[] DataBuf;
return "";
}
// 如果值类型为REG_SZ(字符串型), 它的实际长度包含了一个'\0', 故此减一
if(*DataType == REG_SZ && (*DataLen) > 0)
(*DataLen)-- ;
/** 此处将DataBuf中的数据传送到strRet中,
如果使用赋值号直接赋值的话, 一旦DataBuf中含有'\0',
那么在'\0'后的数据将被截断
*/
string strRet = "";
for(int i = 0 ; i < *DataLen; i++)
strRet += DataBuf[i];
Close();
delete[] DataBuf;
return strRet;
}
bool Regedit::DeleteKey(/* in */ HKEY RootItem, /* in */ const char* SubItem, /* in */ const char* KeyName)
{
Close();
if(!Open(RootItem, SubItem, false))
{
Close();
return false;
}
bool bRet = RegDeleteValue(m_hKey, KeyName) == ERROR_SUCCESS ? true : false;
Close();
return bRet;
}
bool Regedit::DeleteKey(/* in */ HKEY RootItem, /* in */ const char* SubItem)
{
Close();
if(!Open(RootItem, SubItem, false))
{
Close();
return false;
}
unsigned long n;
if(RegQueryInfoKey(m_hKey, 0, 0, 0, 0, 0, 0, &n, 0, 0, 0, 0) != ERROR_SUCCESS)
{
Close();
CString str;
str.Format("%d", GetLastError());
AfxMessageBox(str);
return false;
}
char Buf[MAX_PATH] = { 0 };
unsigned long Len = MAX_PATH;
while(n)
{
n--;
memset(Buf, 0, MAX_PATH);
Len = MAX_PATH;
if(RegEnumValue(m_hKey, 0, Buf, &Len, 0, 0, 0, 0) != ERROR_SUCCESS)
{
Close();
return false;
}
if(RegDeleteValue(m_hKey, Buf) != ERROR_SUCCESS)
{
Close();
return false;
}
}
Close();
return true;
}
vector<string> Regedit::EnumKey (/* in */ HKEY RootItem, /* in */ const char* SubItem)
{
Close();
if(!Open(RootItem, SubItem, false))
{
Close();
return 0;
}
unsigned long n;
if(RegQueryInfoKey(m_hKey, 0, 0, 0, 0, 0, 0, &n, 0, 0, 0, 0) != ERROR_SUCCESS)
{
Close();
return 0;
}
char Buf[MAX_PATH] = { 0 };
unsigned long Len = MAX_PATH;
vector<string> KeyNames;
for(int i = 0 ; i < n; i++)
{
memset(Buf, 0, MAX_PATH);
Len = MAX_PATH;
if(RegEnumValue(m_hKey, i, Buf, &Len, 0, 0, 0, 0) == ERROR_SUCCESS)
{
KeyNames.push_back(Buf);
}
}
Close();
return KeyNames;
}
// 递归实现
bool Regedit::DeleteItem(/* in */ HKEY RootItem, /* in */ const char* SubItem)
{
Close();
if(!Open(RootItem, SubItem, false))
{
Close();
return false;
}
char Buf[MAX_PATH] = { 0 };
while(RegEnumKey(m_hKey, 0, Buf, MAX_PATH) == ERROR_SUCCESS)
{
string strLink = SubItem;
if(strLink.substr(strLink.length() - 1, 1) != "\\")
strLink += "\\";
strLink += Buf;
if( !DeleteItem(RootItem, strLink.c_str()) || !DeleteItem(RootItem, SubItem) )
{
Close();
return false;
}
}
bool bRet = ::RegDeleteKey(m_hKey, "") == ERROR_SUCCESS ? true : false;
Close();
return true;
}
/*
void Regedit::test()
{
// if(DeleteItem(HKEY_LOCAL_MACHINE, "SOFTWARE\\a"))
// AfxMessageBox("OK");
// --------------------------------------------------
// DWORD DataType = 0;
// DWORD DataLen = 0;
// ValueBuf Value = ReadValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\a", "hello", &DataType, &DataLen);
//
// if(DataType == REG_DWORD && DataLen != 0)
// {
// CString strTmp, strResult;
// for(int i = 0 ; i < DataLen ; i++)
// {
// strTmp.Format("%X", Value[i]);
// strResult += strTmp;
// }
// AfxMessageBox(strResult);
// }
// else
// {
// AfxMessageBox("读取的值不是REG_DWORD类型");
// }
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -