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

📄 mfcregoperator.h

📁 QT写的自动更新程序 自认为不错 请大家参考
💻 H
字号:
#ifndef __MFCREFOPERATOR_H_INCLUDED
#define __MFCREFOPERATOR_H_INCLUDED

/*
利用MFC读取注册表的类 
*/


#include "MBCSUNICODESTD.h"
#include "pubfuncs.h"
#include <list>

const MUString PKPMREG = _TT("SOFTWARE\\PKPM\\");
const MUString COMPANYREG = _TT("PKPM");
const HKEY PKPMMAINREG = HKEY_LOCAL_MACHINE;
const MUString PKPMMAINREGSTR = _TT("HKEY_LOCAL_MACHINE");
const unsigned int REGMAXPATH = 256;

#ifdef QT
#include <QtCore/QSettings>
#endif

struct RegOpe
{
	#define exist(key) absolutexist(key, true).first

	//添加一个键
	static bool addNewKey(CREF MUString& _keyname, 
		CREF MUString& directory = PKPMREG, CREF HKEY& mainreg = PKPMMAINREG)
	{
		MUString keyname = directory + _keyname;

		HKEY mkey;
		DWORD dw;

		LONG reCode = ::RegCreateKeyEx(mainreg,
			(LPCTSTR)keyname.c_str(),
			NULL,
			NULL,
			REG_OPTION_NON_VOLATILE,
			KEY_ALL_ACCESS,
			NULL,
			&mkey,
			&dw);

		if (reCode == ERROR_SUCCESS)
		{
			::RegCloseKey(mkey);
			return true;
		}

		return false;
	}

	//判断该键是否存在
	//一般调用请 使用 exist 宏判断
	static std::pair<bool, HKEY> absolutexist(CREF MUString& _keyname, 
		bool autoclose = true, 
		CREF MUString& directory = PKPMREG, CREF HKEY& mainreg = PKPMMAINREG)
	{
		MUString keyname = directory + _keyname;

		HKEY rekey;

		LPCTSTR temKeyname = (LPCTSTR)keyname.c_str();
		LONG reCode = ::RegOpenKeyEx(mainreg,
			temKeyname, 
			NULL, 
			KEY_ALL_ACCESS,
			&rekey);

		if (reCode == ERROR_SUCCESS)
		{
			if (autoclose)
			{
				::RegCloseKey(rekey);
				return std::make_pair<bool, HKEY>(true, NULL);
			}
			return std::make_pair<bool, HKEY>(true, rekey);
		}
		
		return std::make_pair<bool, HKEY>(false, NULL);
	}

	//删除一个键
	static bool removeKey(CREF MUString& _keyname,
		CREF MUString& directory = PKPMREG, CREF HKEY& mainreg = PKPMMAINREG)
	{
		if (exist(_keyname))
		{
			MUString keyname = directory + _keyname;
			LONG reCode = ::RegDeleteKeyEx(mainreg, 
				(LPCTSTR)_keyname.c_str(), 
				KEY_ALL_ACCESS, 
				NULL);

			if (reCode == ERROR_SUCCESS)
			{
				return true;
			}
			else
				return false;
		}
		return true;
	}

	static bool getSubKeyList(CREF MUString& _keyname,std::list<MUString>& SubList,
		CREF MUString& directory = PKPMREG, CREF HKEY& mainreg = PKPMMAINREG)
	{
		DWORD	numSubKey=0;					//存放子键的项数
		DWORD	i;								//计数
		DWORD   sizeSubKey;						//子键大小
		TCHAR	subKey[255];			//子键名
		SubList.clear();
		
		if (exist(_keyname))
		{
			HKEY openedKey = absolutexist(_keyname, false).second;
			RegQueryInfoKey(openedKey,
				NULL,//keyname.GetBuffer(keyname.GetLength()),
				NULL,//(LPDWORD)strName.GetBuffer(strName.GetLength()),//NULL,
				NULL,//NULL,
				&numSubKey,		//查得子键的项数
				NULL,
				NULL,
				NULL,
				NULL,
				NULL,
				NULL,
				NULL
				);
			if (numSubKey)	
			{
				for (i=0; i<numSubKey; i++)
				{
					subKey[0]='\0';				//该两行很重要,保证了每次循环的初始	
					sizeSubKey=255;	//第一行清空子键,第二行赋缓冲区大小

					RegEnumKeyEx(	openedKey,		//键柄
						i,			//子键序号
						subKey,		//存入子键名
						&sizeSubKey,//指明缓冲区大小
						NULL,
						NULL,
						NULL,
						NULL);
					SubList.push_back(subKey);
				}
				::RegCloseKey(openedKey);
				return true;
			}
		}
		return true;
	}


	//自动切换数据类型
	template<typename T>
	static DWORD  getValueTypeMode(CREF T&)
	{}
	template<>
	static DWORD getValueTypeMode(CREF MCString&)
	{
		return (DWORD)REG_SZ;
	}
	template<>
	static DWORD getValueTypeMode(CREF DWORD&)
	{
		return (DWORD)REG_DWORD;
	}
	
	//根据数据类型生成实例
	template<typename TTYPE>
	static void makeData(TTYPE& obj, BYTE* _parray, int size)
	{
		obj = TTYPE(_parray);
	}
	template<>
	static void makeData(MCString& obj, BYTE* _parray, int size)
	{
#ifdef _MBCS
		BYTE* noempty = _parray;
#else
		BYTE* noempty = pubfunc::skipEmpty(_parray, size);
#endif // _UNICODE
		
		obj = MCString((LPCTSTR)noempty);
#ifdef _UNICODE
		pubfunc::releasearray(noempty);
#endif
	}

	//查询一个键值
	template<typename T>
	static bool query(CREF MUString& _key, CREF MUString& _valuename, T& _value)
	{
		if (exist(_key))
		{
			HKEY openedKey = absolutexist(_key, false).second;

			DWORD modetype = getValueTypeMode(_value);
			BYTE data[REGMAXPATH];
			DWORD cbdata = sizeof(data);

			LONG reCode = ::RegQueryValueEx(openedKey,
				(LPCTSTR)_valuename.c_str(),
				NULL,
				&modetype,
				data,
				&cbdata
				);

			if (ERROR_SUCCESS!=reCode)return false;

			makeData(_value, data, cbdata);
	
			::RegCloseKey(openedKey);

			return true;
		}
		return false;
	}

	//数值转换
	template<typename TTYPE>
	static std::pair<LPBYTE, int> convert2LPBYTE(TTYPE& value)
	{
		return std::make_pair(NULL, NULL);
	}
	//CString -> Byte
	template<>
	static std::pair<LPBYTE, int> convert2LPBYTE(MCString& value)
	{
		LPBYTE lpbyte;
#ifdef NONMFC
		lpbyte = (LPBYTE)value.c_str();
		return std::make_pair(lpbyte, value.length());
#else
		lpbyte = (LPBYTE)value.GetBuffer(value.GetLength());
		value.ReleaseBuffer();
		return std::make_pair(lpbyte, value.GetLength());
#endif
	}

	//设置一个键值
	template<typename T>
	static bool setKeyValue(CREF MUString& _valuepath, CREF T& value,
		CREF MUString& directory = PKPMREG, CREF HKEY& mainreg = PKPMMAINREG)
	{
		MUString keyname = directory + _valuepath;

		std::pair<LPBYTE, int> data = convert2LPBYTE(value);
		LONG reCode = ::RegSetValueEx(mainreg,
			keyname,
			NULL,
			getValueTypeMode(value),
			data.first,
			data.second
			);

		return reCode == ERROR_SUCCESS;
	}

#ifdef QT
	static bool getKeyValueSpStr(CREF QString& s1, CREF QString& s2, REF QString& value)
	{
		QString xstr = 
#ifdef _UNICODE
			QString::fromStdWString(PKPMMAINREGSTR.c_str()) + "\\" +
			QString::fromStdWString(PKPMREG.c_str()) + s1
#else
			QString::fromStdString(PKPMMAINREGSTR.c_str()) + "\\" +
			QString::fromStdString(PKPMREG.c_str()) + s1
#endif
			;

		QString path = xstr.simplified();//由于QString在结尾加上两个符号,需要剔除
		QSettings mysetting(path, QSettings::NativeFormat);
		if (mysetting.value(s2, "NONE").toString() == "NONE")
			return false;

		value = mysetting.value(s2).toString();
		return true;
	}
#endif

};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -