vs2019 MFC 注册表REG_DWORD,REG_SZ,REG_BINARY操作例程,包含增加注册表子项 删除注册表子项以及键值

35 篇文章 8 订阅

 例程完成功能测试图,另外本人写软件有个缺点,过度的依赖Cstring类型字符串,因此操作结果和操作前要操作的数据几乎都使用Cstring类型数据。另外就是注册表中的二进制数是以16进制保存的。

 

 封装类H头文件

#ifndef _H_HKEYREGQUERY
#define  _H_HKEYREGQUERY
#include<Windows.h>
#include<cstring>
using namespace std;
#pragma once
class hKeyRegQuery
{
public:
	hKeyRegQuery();
	virtual~hKeyRegQuery();
public:
	void  Read_Dword(LPCTSTR dataPath, LPCWSTR lpValueName,DWORD &dwReadValue);
	void  Read_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpValueName, CString& strReadValue);
	void  Write_Dword(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName,DWORD dwValue);
	void  Write_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString strValue);
	void  Write_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString binaryValue);
	void  Read_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpValueName, CString& binaayValue);
	void  Delete_Value(LPCTSTR dataPath, LPCWSTR lpValueName);
	void  Delete_Key(LPCTSTR dataPath, LPCWSTR lpValueName);
public:
	DWORD WriteAndReadBinaryLenth;
private:

protected:

};

#endif 

 封装类CPP实现文件

#include "pch.h"
#include "hKeyRegQuery.h"

hKeyRegQuery::hKeyRegQuery()
{
	WriteAndReadBinaryLenth = 0;
}
hKeyRegQuery::~hKeyRegQuery()
{
}

void hKeyRegQuery::Read_Dword(LPCTSTR dataPath,LPCWSTR lpValueName, DWORD& dwReadValue)
{
	HKEY hKey;
	DWORD dwValue;
	DWORD dwSize = sizeof(DWORD);
	DWORD dwType = REG_DWORD;

	if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath,0,KEY_READ,&hKey))
	{
		if (::RegQueryValueEx(hKey, lpValueName,NULL, &dwType,(LPBYTE)&dwValue,&dwSize)!=ERROR_SUCCESS)
		{
			printf("错误提示:无法查询到相关的注册表信息!");
			printf("\n");
		}
		else
		{
			dwReadValue = dwValue;
			printf("已成功从注册表中读取数值信息!");
			printf("\n");
			printf("dwValue=%d",dwValue);
			printf("\n");
		}
	}
	else
	{
		printf("错误提示:注册表打开失败请先检查注册表项后重试!");
		printf("\n");
	}
	::RegCloseKey(hKey);
}

void hKeyRegQuery::Read_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpValueName, CString& strReadValue)
{
	HKEY    hKey;
	DWORD   dwSizew = 256;
	LPBYTE  lpItemCharValue = new BYTE[dwSizew];
	CString strValue;
	DWORD   dwType = REG_SZ;

	if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath, 0, KEY_READ, &hKey))
	{
		if (::RegQueryValueEx(hKey,lpValueName,NULL,&dwType,lpItemCharValue,&dwSizew)!=ERROR_SUCCESS)
		{
			printf("错误提示:无法查询到相关的注册表信息!");
			printf("\n");
		}
		else
		{
			strValue = (TCHAR*)lpItemCharValue;
			strReadValue = strValue;
			printf("已成功从注册表中读取字符串信息!");
			printf("\n");
			printf("dwValue=%ws", (TCHAR*)lpItemCharValue);
			printf("\n");
		}
	}
	else
	{
		printf("错误提示:注册表打开失败请先检查注册表项后重试!");
		printf("\n");
	}
	delete[] lpItemCharValue;
	lpItemCharValue = NULL;
	::RegCloseKey(hKey);
}

void hKeyRegQuery::Write_Dword(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName,DWORD dwValue)
{
	HKEY   hKey;
	HKEY   hTemKey;
	DWORD  dwSize = sizeof(DWORD);
	DWORD  dwType = REG_DWORD;

	if (ERROR_SUCCESS== ::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath, NULL, KEY_SET_VALUE, &hKey))
	{
		if (ERROR_SUCCESS==RegCreateKey(hKey, lpCreateKeyName,&hTemKey))
		{
			if (ERROR_SUCCESS!=RegSetValueEx(hTemKey, lpSubKeyName,NULL, dwType,(CONST BYTE*)&dwValue, dwSize))
			{
				printf("注册信息写入注册表失败,请确认后重试!");
				printf("\n");
			}
			else
			{
				printf("注册信息已写入注册表,并成功修改注册表!");
				printf("\n");
				printf("dwValue=%d", dwValue);
				printf("\n");
			}
		}
	}
	::RegCloseKey(hKey);
}

void hKeyRegQuery::Write_Reg_SZ(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString strValue)
{
	HKEY    hKey;
	HKEY    hTemKey;
	DWORD   dwType = REG_SZ;
		if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath, NULL, KEY_SET_VALUE, &hKey))
		{
			if (ERROR_SUCCESS == RegCreateKey(hKey, lpCreateKeyName, &hTemKey))
			{
				if (ERROR_SUCCESS != RegSetValueEx(hTemKey, lpSubKeyName, NULL, dwType, (const BYTE*)(LPSTR)(LPCTSTR)strValue, strValue.GetLength()*sizeof(LPSTR)))
				{
					printf("注册信息写入注册表失败,请确认后重试!");
					printf("\n");
				}
				else
				{
					printf("注册信息已写入注册表,并成功修改注册表!");
					printf("\n");
					printf("strValue=%ws", (LPCTSTR)strValue);
					printf("\n");
				}
			}
		}
		::RegCloseKey(hKey);
}
void hKeyRegQuery::Write_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpCreateKeyName, LPCWSTR lpSubKeyName, CString binaryValue)
{
	HKEY    hKey;
	HKEY    hTemKey;
	DWORD   dwType = REG_BINARY;

	int len = WideCharToMultiByte(CP_ACP, 0, binaryValue, binaryValue.GetLength(), NULL, 0, NULL, NULL);
	WriteAndReadBinaryLenth = len;
	printf("%d", WriteAndReadBinaryLenth);
	if (WriteAndReadBinaryLenth==0)
	{
		printf("请确保要写入的信息不为空,请确认后重试!");
		printf("\n");
		return;
	}
	unsigned char* pByte = (unsigned char*)malloc((len + 1) * sizeof(unsigned char));
	if (pByte != NULL)
	{
		memset(pByte, 0, (len + 1) * sizeof(unsigned char));
		WideCharToMultiByte(CP_ACP, 0, binaryValue.GetBuffer(), binaryValue.GetLength(), (LPSTR)pByte, len, NULL, NULL);
		*(pByte + len + 1) = '\0';
	}
	else
	{
		printf("请确保要写入的信息不为空,请确认后重试!");
		printf("\n");
		return;
	}
	if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath,NULL,KEY_SET_VALUE,&hKey))
	{
		if (ERROR_SUCCESS==::RegCreateKey(hKey,lpCreateKeyName,&hTemKey))
		{
			if (ERROR_SUCCESS!=RegSetValueEx(hTemKey, lpSubKeyName,NULL,dwType, pByte, len))
			{
				printf("注册信息写入注册表失败,请确认后重试!");
				printf("\n");
			}
			else
			{
				printf("注册信息已写入注册表,并成功修改注册表!");
				printf("\n");
				for (INT i = 0; i < len; i++)
				{
					printf("binaryValue=%c", *(pByte+i));
					printf("\n");
				}
			}

		}
	}
	::RegCloseKey(hKey);
}
void hKeyRegQuery::Read_Reg_Binary(LPCTSTR dataPath, LPCWSTR lpValueName, CString& binaayValue)
{
	HKEY     hkey;
	DWORD    dwType=REG_BINARY;
	DWORD    lenthBinary = WriteAndReadBinaryLenth;
	LPBYTE   BinaryValue=new BYTE[lenthBinary];
	CString  str;
	printf("%d", lenthBinary);
	if (lenthBinary == 0)
	{
		printf("请确认注册表读取信息长度是否正确,请确认后重试!");
		printf("\n");
		return;
	}
	ZeroMemory(BinaryValue,sizeof(BYTE));
	if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER,dataPath,NULL,KEY_READ,&hkey))
	{
		if (ERROR_SUCCESS!=RegQueryValueEx(hkey, lpValueName,NULL,&dwType, BinaryValue,&lenthBinary))
		{
			printf("错误提示:无法查询到相关的注册表信息!");
			printf("\n");
		}
		else
		{
			for (unsigned int i = 0; i <lenthBinary; i++)
			{
				printf("BinaryValue=%c", BinaryValue[i]);
				printf("\n");
				str.Format(_T("%c"), BinaryValue[i]);
				binaayValue = binaayValue + str;
			}

		}
	}
	binaayValue.Replace(_T(" "),_T(""));
	::RegCloseKey(hkey);
	delete[] BinaryValue;
}
void hKeyRegQuery::Delete_Value(LPCTSTR dataPath, LPCWSTR lpValueName)
{
	HKEY hKey;
	if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER,dataPath,0,KEY_SET_VALUE,&hKey))
	{
		if (ERROR_SUCCESS!=::RegDeleteValue(hKey, lpValueName))
		{
			printf("注册表键值删除失败,请确认后重试!");
			printf("\n");
		}
		else
		{
			printf("注册表键值删除成功!");
			printf("\n");
		}
	}
	::RegCloseKey(hKey);
}

void hKeyRegQuery::Delete_Key(LPCTSTR dataPath, LPCWSTR lpValueName)
{
	HKEY hKey;
	if (ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER, dataPath,0,KEY_SET_VALUE,&hKey))
	{
		if (ERROR_SUCCESS!=::RegDeleteKey(hKey, lpValueName))
		{
			printf("注册表子键删除失败,请确认后重试!");
			printf("\n");
		}
		else
		{
			printf("注册表子键删除成功!");
			printf("\n");
		}
	}
	::RegCloseKey(hKey);
}

注意事项 :

         二进制读取操作首先要确保注册表相应的位置写入的长度,长度不明确或使用MAX_PATH会导致读取数据有乱码。因此本例程必须先写入,在读取。写入过程得到写入数据的长度,读取过程根据此长度来读取。

应用实例 H头文件和CPP文件:

#include "hKeyRegQuery.h"
#pragma once

class CMFCApplicationRegisterDemoDlg : public CDialogEx
{
public:
	CMFCApplicationRegisterDemoDlg(CWnd* pParent = nullptr);	

#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MFCAPPLICATIONREGISTERDEMO_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	

protected:
	HICON m_hIcon;

	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButtondreadkey();
	afx_msg void OnBnClickedButtondbuildkeysubitem();
	afx_msg void OnBnClickedButtondwritestr();
	afx_msg void OnBnClickedButtondwritekey();
	afx_msg void OnBnClickedButtondreadkeystr();
	afx_msg void OnBnClickedButtonddeletekeyvalue();
	afx_msg void OnBnClickedButtonddeletekey();
	afx_msg void OnBnClickedButtonwritebinary();
	afx_msg void OnBnClickedButtonreadbinary();
	hKeyRegQuery m_ItemKeyControl;
};


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtondwritestr()
{
	CString hKeyPath = _T("Software");
	CString hCreateKeyName = _T("ReflowerController");
	CString hSubKeyName = _T("SerialCode");
	CString strSerialCode;
	GetDlgItemText(IDC_EDITWRITEREGSTR, strSerialCode);
	m_ItemKeyControl.Write_Reg_SZ(hKeyPath, hCreateKeyName, hSubKeyName, strSerialCode);

}


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtondwritekey()
{

	CString hKeyPath = _T("Software");
	CString hCreateKeyName = _T("ReflowerController");
	CString hSubKeyName = _T("DaysRemain");
	DWORD   hRemainDays= GetDlgItemInt(IDC_EDITREADKEYWORDVALUE);
	m_ItemKeyControl.Write_Dword(hKeyPath, hCreateKeyName, hSubKeyName, hRemainDays);
}


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtondreadkeystr()
{
	CString hKeyPath = _T("Software\\ReflowerController");
	CString hSubKeyName = _T("SerialCode");
	CString strSerialCode;
	m_ItemKeyControl.Read_Reg_SZ(hKeyPath, hSubKeyName, strSerialCode);
	SetDlgItemText(IDC_EDITREADSTR, strSerialCode);
}


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonddeletekeyvalue()
{
	CString hKeyPath = _T("Software\\ReflowerController");
	CString hSubKeyName = _T("SerialCode");
	m_ItemKeyControl.Delete_Value(hKeyPath, hSubKeyName);
}


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonddeletekey()
{
	CString hKeyPath = _T("Software");
	CString hSubKeyName = _T("ReflowerController");
	m_ItemKeyControl.Delete_Key(hKeyPath, hSubKeyName);
}


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonwritebinary()
{
	CString hKeyPath = _T("Software");
	CString hCreateKeyName = _T("ReflowerController");
	CString hSubKeyName = _T("ProductID");
	CString WriteBinary;
	GetDlgItemText(IDC_EDITWRITEBINARY, WriteBinary);
	m_ItemKeyControl.Write_Reg_Binary(hKeyPath, hCreateKeyName, hSubKeyName, WriteBinary);
}


void CMFCApplicationRegisterDemoDlg::OnBnClickedButtonreadbinary()
{
	CString hKeyPath = _T("Software\\ReflowerController");
	CString hSubKeyName = _T("ProductID");
	CString ReadBinary;
	m_ItemKeyControl.Read_Reg_Binary(hKeyPath, hSubKeyName, ReadBinary);
	SetDlgItemText(IDC_EDITREADBINARY, ReadBinary);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值