?? 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查詢數(shù)據(jù)長度
if(RegQueryValueEx(m_hKey, KeyName, 0, DataType, 0, DataLen) != ERROR_SUCCESS)
{
Close();
return "";
}
//分配數(shù)據(jù)緩沖區(qū)
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中的數(shù)據(jù)傳送到strRet中,
如果使用賦值號直接賦值的話, 一旦DataBuf中含有'\0',
那么在'\0'后的數(shù)據(jù)將被截斷
*/
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;
}
// 遞歸實現(xiàn)
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類型");
// }
}*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -