⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regedit.cpp

📁 QQ自动登陆器, 同时支持TM, 利用QQ可以从命令行接收参数登陆的特点制做, 源码中有QQ密码加密的完整算法, 开发环境, VC++6.0
💻 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 + -